Pertanyaan Temukan objek dengan id dalam larik objek JavaScript
Saya punya array:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
Saya tidak dapat mengubah struktur array. Saya sedang melewati sebuah id 45
, dan saya ingin mendapatkannya 'bar'
untuk objek itu dalam larik.
Bagaimana saya melakukannya di JavaScript atau menggunakan jQuery?
1104
2017-09-09 15:42
asal
Jawaban:
Menggunakan find()
metode:
myArray.find(x => x.id === '45').foo;
Dari MDN:
Itu find()
metode mengembalikan nilai dalam array, jika elemen dalam array memenuhi fungsi pengujian yang disediakan. Jika tidak undefined
dikembalikan.
Jika Anda ingin menemukannya indeks sebagai gantinya, gunakan findIndex()
:
myArray.findIndex(x => x.id === '45');
Dari MDN:
Itu findIndex()
metode mengembalikan indeks elemen pertama dalam larik yang memenuhi fungsi pengujian yang disediakan. Jika tidak -1 dikembalikan.
Jika Anda ingin mendapatkan larik elemen yang cocok, gunakan filter()
metode sebaliknya:
myArray.filter(x => x.id === '45');
Ini akan mengembalikan larik objek. Jika Anda ingin mendapatkan array foo
properti, Anda dapat 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 melakukan transpile menggunakan kode Anda Babel (dengan polyfill).
427
2018-02-14 21:11
Karena Anda sudah menggunakan jQuery, Anda dapat menggunakan grep fungsi yang dimaksudkan untuk mencari larik:
var result = $.grep(myArray, function(e){ return e.id == id; });
Hasilnya adalah larik 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 dari array yang dihasilkan. Contoh:
if (result.length == 0) {
// not found
} else if (result.length == 1) {
// access the foo property using result[0].foo
} else {
// multiple items found
}
1420
2017-09-09 15:54
Solusi lain adalah membuat objek pencarian:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
Ini sangat menarik jika Anda perlu melakukan banyak pencarian.
Ini tidak akan membutuhkan lebih banyak memori karena ID dan objek akan dibagikan.
343
2017-09-09 15:50
ECMAScript 2015 menyediakan menemukan() metode pada array:
var myArray = [
{id:1, name:"bob"},
{id:2, name:"dan"},
{id:3, name:"barb"},
]
// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);
// print
console.log(item.name);
Ia bekerja tanpa pustaka eksternal. Tetapi jika Anda mau dukungan browser lama Anda mungkin ingin memasukkan polyfill ini.
146
2018-02-10 22:32
Underscore.js memiliki metode yang bagus untuk itu:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
138
2017-11-22 12:52
Saya pikir cara termudah adalah sebagai berikut, tetapi tidak akan berfungsi di Internet Explorer 8 (atau sebelumnya):
var result = myArray.filter(function(v) {
return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property
123
2017-09-09 15:46
Coba yang berikut ini
function findById(source, id) {
for (var i = 0; i < source.length; i++) {
if (source[i].id === id) {
return source[i];
}
}
throw "Couldn't find object with id: " + id;
}
64
2017-09-09 15:45
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
42
2018-04-16 17:31
Versi generik dan versi yang lebih fleksibel dari fungsi findById di atas:
// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
for (var i = 0; i < array.length; i++) {
if (array[i][key] === value) {
return array[i];
}
}
return null;
}
var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');
30
2017-07-13 20:34
Anda dapat menggunakan filter,
function getById(id, myArray) {
return myArray.filter(function(obj) {
if(obj.id == id) {
return obj
}
})[0]
}
get_my_obj = getById(73, myArray);
13
2017-09-13 09:43