Gunakan find()
metode:
myArray.find(x => x.id === '45').foo;
Dari MDN :
The find()
Metode mengembalikan nilai pertama dalam array, jika elemen dalam memenuhi berbagai fungsi pengujian yang disediakan. Kalau undefined
tidak dikembalikan.
Jika Anda ingin menemukan indeksnya , gunakan findIndex()
:
myArray.findIndex(x => x.id === '45');
Dari MDN :
The findIndex()
method mengembalikan indeks dari elemen pertama dalam array yang memenuhi disediakan pengujian fungsi. Kalau tidak -1 dikembalikan.
Jika Anda ingin mendapatkan array elemen yang cocok, gunakan filter()
metode ini sebagai gantinya:
myArray.filter(x => x.id === '45');
Ini akan mengembalikan array objek. Jika Anda ingin mendapatkan array foo
properti, Anda bisa melakukan ini dengan map()
metode:
myArray.filter(x => x.id === '45').map(x => x.foo);
Catatan samping: metode seperti find()
atau filter()
, dan fungsi panah tidak didukung oleh browser lama (seperti IE), jadi jika Anda ingin mendukung browser ini, Anda harus mengubah kode Anda menggunakan Babel (dengan polyfill ).
Michał Perłakowski
sumber
Karena Anda sudah menggunakan jQuery, Anda bisa menggunakan fungsi grep yang dimaksudkan untuk mencari array:
Hasilnya adalah array dengan item yang ditemukan. Jika Anda tahu bahwa objek itu selalu ada dan itu hanya terjadi sekali, Anda bisa menggunakannya
result[0].foo
untuk mendapatkan nilainya. Kalau tidak, Anda harus memeriksa panjang array yang dihasilkan. Contoh:sumber
===
daripada==
, untuk menghindari masalah aneh dengan==
operator JavaScript .e.id
danid
akan menjadi string, saya kira tidak apa-apa untuk digunakan==
. Tapi jika Anda tidak yakin, Anda mungkin menghadapi masalah (karena'' == 0
merupakantrue
tetapi'' === 0
adalahfalse
). Belum lagi===
tampaknya lebih cepat ( stackoverflow.com/questions/359494/… ).===
karena berfungsi persis seperti==
di bahasa pemrograman lain. Saya menganggap==
tidak ada dalam JavaScript.Solusi lain adalah membuat objek pencarian:
Ini sangat menarik jika Anda perlu melakukan banyak pencarian.
Ini tidak akan membutuhkan lebih banyak memori karena ID dan objek akan dibagikan.
sumber
lookup
objek adalah buang-buang waktu.ECMAScript 2015 menyediakan metode find () pada array:
Ini bekerja tanpa perpustakaan eksternal. Tetapi jika Anda ingin dukungan browser yang lebih lama, Anda mungkin ingin memasukkan polyfill ini .
sumber
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Tapi ini adalah jawaban lama yang ditulis sebelum sintaksis ES2015 juga didukung seperti sekarang. @ Gothdo menjawab saat ini yang paling baru di utas.myArray.find(d => d.id === 45)?.foo
.Underscore.js memiliki metode yang bagus untuk itu:
sumber
Saya pikir cara termudah adalah sebagai berikut, tetapi itu tidak akan berfungsi di Internet Explorer 8 (atau sebelumnya):
sumber
for
?for
loop langsung .for
loop akan berakhir pada pertandingan pertama.id
Coba yang berikut ini
sumber
sumber
Versi generik dan lebih fleksibel dari fungsi findById di atas:
sumber
Anda bisa mendapatkan ini dengan mudah menggunakan fungsi map () :
Contoh kerja: http://jsfiddle.net/hunter/Pxaua/
sumber
map
secara otomatis menghapusnull
elemen. Kedengarannya menyesatkan bagi saya dan konsep umummap
, karena hasilnya tidak sama dengan koleksi aslinya.Anda dapat menggunakan filter,
sumber
Walaupun ada banyak jawaban yang benar di sini, banyak dari mereka tidak membahas fakta bahwa ini adalah operasi yang tidak perlu mahal jika dilakukan lebih dari satu kali. Dalam kasus ekstrim ini bisa menjadi penyebab masalah kinerja nyata.
Di dunia nyata, jika Anda memproses banyak item dan kinerja menjadi masalah, awalnya lebih cepat untuk membangun pencarian:
Anda kemudian bisa mendapatkan item dalam waktu yang tetap seperti ini:
Anda juga dapat mempertimbangkan menggunakan Peta alih-alih objek sebagai pencarian: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
sumber
Menggunakan asli
Array.reduce
mengembalikan elemen objek jika ditemukan, jika tidak
false
sumber
Jika Anda melakukan ini beberapa kali, Anda dapat mengatur Peta (ES6):
Maka Anda cukup melakukan:
sumber
Inilah cara saya melakukannya dalam JavaScript murni, dengan cara paling minimal yang dapat saya pikirkan yang berfungsi di ECMAScript 3 atau lebih baru. Ia kembali segera setelah kecocokan ditemukan.
sumber
Lebih generik dan pendek
dalam kasus Anda Kel.
var element = findFromArray(myArray,'id',45)
itu akan memberi Anda seluruh elemen.sumber
Anda dapat mencoba Sugarjs dari http://sugarjs.com/ .
Ini memiliki metode yang sangat manis pada Array
.find
,. Jadi Anda dapat menemukan elemen seperti ini:Anda juga dapat meneruskan objek dengan properti lebih banyak untuk menambahkan "di mana-klausa" lainnya.
Perhatikan bahwa Sugarjs memperluas objek asli, dan beberapa orang menganggap ini sangat jahat ...
sumber
find
. Saran saya adalah jika Anda ingin memperluas prototipe asli, selalu gunakan nama yang lebih spesifik, biarkan yang paling sederhana untuk pengembangan standar di masa depan.Membangun jawaban yang diterima:
jQuery:
Atau CoffeeScript:
sumber
Baru-baru ini, saya harus menghadapi hal yang sama di mana saya perlu mencari string dari array yang sangat besar.
Setelah beberapa pencarian saya menemukan itu akan mudah ditangani dengan kode sederhana:
Kode:
Lihat https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
sumber
Iterasi item apa pun dalam array. Untuk setiap item yang Anda kunjungi, periksa id item itu. Jika itu cocok, kembalikan.
Jika Anda hanya ingin kode:
Dan hal yang sama menggunakan metode Array ECMAScript 5:
sumber
Selama browser mendukung ECMA-262 , edisi ke-5 (Desember 2009), ini akan berfungsi, hampir satu baris:
sumber
bFound
hanyalah sebuah boolean yangtrue
jika suatu elemen memenuhi kondisi yang diperlukan.Anda dapat melakukan ini bahkan dalam JavaScript murni dengan menggunakan fungsi "filter" bawaan untuk array:
Jadi sekarang cukup berikan "id" di tempat
key
dan "45" di tempatvalue
, dan Anda akan mendapatkan objek penuh yang cocok dengan id 45. Jadi,sumber
Gunakan
Array.prototype.filter()
fungsi.DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
SARING
sumber
.filter
metode diobj.info
dalam nested loop.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Kita bisa menggunakan metode Jquery
$.each()/$.grep()
atau
gunakan sintaks ES6:
Atau gunakan Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
sumber
Saya benar-benar menyukai jawaban yang diberikan oleh Aaron Digulla tetapi perlu menyimpan berbagai objek saya sehingga saya bisa mengulanginya nanti. Jadi saya memodifikasinya
sumber
Menggunakan:
Seharusnya mengembalikan objek dengan id.
sumber
Solusi ini dapat membantu juga:
Saya membuatnya seperti
$.grep
dan jika satu objek mengetahui, fungsi akan mengembalikan objek, bukan array.sumber
function will return the object, rather than an array
bisa mendapatkan kesalahan, tapi saya pikir itu tergantung pada pengguna.Mulai dari jawaban aggaton , ini adalah fungsi yang benar-benar mengembalikan elemen yang diinginkan (atau
null
jika tidak ditemukan), mengingatarray
dancallback
fungsi yang mengembalikan nilai kebenaran untuk elemen "benar":Ingatlah bahwa ini tidak bekerja pada IE8-, karena tidak mendukung
some
. Sebuah polyfill dapat disediakan, atau selalu adafor
loop klasik :Ini sebenarnya lebih cepat dan lebih kompak. Tetapi jika Anda tidak ingin menemukan kembali roda, saya sarankan menggunakan perpustakaan utilitas seperti garis bawah atau lodash.
sumber
Terpendek,
sumber
Pertimbangkan "axesOptions" sebagai larik objek dengan format objek menjadi {: field_type => 2,: fields => [1,3,4]}
sumber