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