Jawaban:
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. Kalauundefined
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 ).
Karena Anda sudah menggunakan jQuery, Anda bisa menggunakan fungsi grep yang dimaksudkan untuk mencari array:
var result = $.grep(myArray, function(e){ return e.id == id; });
Hasilnya adalah array dengan item yang ditemukan. Jika Anda tahu bahwa objek itu selalu ada dan itu hanya terjadi sekali, Anda bisa menggunakannyaresult[0].foo
untuk mendapatkan nilainya. Kalau tidak, Anda harus memeriksa panjang array yang dihasilkan. Contoh:
if (result.length === 0) {
// no result found
} else if (result.length === 1) {
// property found, access the foo property using result[0].foo
} else {
// multiple items found
}
===
daripada ==
, untuk menghindari masalah aneh dengan ==
operator JavaScript .
e.id
dan id
akan menjadi string, saya kira tidak apa-apa untuk digunakan ==
. Tapi jika Anda tidak yakin, Anda mungkin menghadapi masalah (karena '' == 0
merupakan true
tetapi '' === 0
adalah false
). 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:
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.
lookup
objek adalah buang-buang waktu.
ECMAScript 2015 menyediakan metode find () 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);
Ini bekerja tanpa perpustakaan eksternal. Tetapi jika Anda ingin dukungan browser yang lebih lama, Anda mungkin ingin memasukkan polyfill ini .
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:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
Saya pikir cara termudah adalah sebagai berikut, tetapi itu 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
for
?
for
loop langsung .
for
loop akan berakhir pada pertandingan pertama.
id
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;
}
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
Versi generik dan 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');
Anda bisa mendapatkan ini dengan mudah menggunakan fungsi map () :
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var found = $.map(myArray, function(val) {
return val.id == 45 ? val.foo : null;
});
//found[0] == "bar";
Contoh kerja: http://jsfiddle.net/hunter/Pxaua/
map
secara otomatis menghapus null
elemen. Kedengarannya menyesatkan bagi saya dan konsep umum map
, karena hasilnya tidak sama dengan koleksi aslinya.
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);
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:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
Anda kemudian bisa mendapatkan item dalam waktu yang tetap seperti ini:
var bar = o[id];
Anda juga dapat mempertimbangkan menggunakan Peta alih-alih objek sebagai pencarian: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
Array.reduce
var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
return (a.id==id && a) || (b.id == id && b)
});
mengembalikan elemen objek jika ditemukan, jika tidak false
Jika Anda melakukan ini beberapa kali, Anda dapat mengatur Peta (ES6):
const map = new Map( myArray.map(el => [el.id, el]) );
Maka Anda cukup melakukan:
map.get(27).foo
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.
var getKeyValueById = function(array, key, id) {
var testArray = array.slice(), test;
while(test = testArray.pop()) {
if (test.id === id) {
return test[key];
}
}
// return undefined if no matching id is found in array
return;
}
var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');
// result is 'bar', obtained from object with id of '45'
Lebih generik dan pendek
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
dalam kasus Anda Kel. var element = findFromArray(myArray,'id',45)
itu akan memberi Anda seluruh elemen.
Anda dapat mencoba Sugarjs dari http://sugarjs.com/ .
Ini memiliki metode yang sangat manis pada Array .find
,. Jadi Anda dapat menemukan elemen seperti ini:
array.find( {id: 75} );
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 ...
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:
var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)
Atau CoffeeScript:
foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo
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:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
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:
function getId(array, id) {
for (var i = 0, len = array.length; i < len; i++) {
if (array[i].id === id) {
return array[i];
}
}
return null; // Nothing found
}
Dan hal yang sama menggunakan metode Array ECMAScript 5:
function getId(array, id) {
var obj = array.filter(function (val) {
return val.id === id;
});
// Filter returns an array, and we just want the matching item.
return obj[0];
}
Anda dapat melakukan ini bahkan dalam JavaScript murni dengan menggunakan fungsi "filter" bawaan untuk array:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
Jadi sekarang cukup berikan "id" di tempat key
dan "45" di tempat value
, dan Anda akan mendapatkan objek penuh yang cocok dengan id 45. Jadi,
myArr.filterObjects("id", "45");
Gunakan Array.prototype.filter()
fungsi.
DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
var jsonObj =[
{
"name": "Me",
"info": {
"age": "15",
"favColor": "Green",
"pets": true
}
},
{
"name": "Alex",
"info": {
"age": "16",
"favColor": "orange",
"pets": false
}
},
{
"name": "Kyle",
"info": {
"age": "15",
"favColor": "Blue",
"pets": false
}
}
];
SARING
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
metode di obj.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()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
atau
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
gunakan sintaks ES6:
Array.find, Array.filter, Array.forEach, Array.map
Atau gunakan Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
Saya benar-benar menyukai jawaban yang diberikan oleh Aaron Digulla tetapi perlu menyimpan berbagai objek saya sehingga saya bisa mengulanginya nanti. Jadi saya memodifikasinya
var indexer = {};
for (var i = 0; i < array.length; i++) {
indexer[array[i].id] = parseInt(i);
}
//Then you can access object properties in your array using
array[indexer[id]].property
Menggunakan:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
Seharusnya mengembalikan objek dengan id.
Solusi ini dapat membantu juga:
Array.prototype.grep = function (key, value) {
var that = this, ret = [];
this.forEach(function (elem, index) {
if (elem[key] === value) {
ret.push(that[index]);
}
});
return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");
Saya membuatnya seperti $.grep
dan jika satu objek mengetahui, fungsi akan mengembalikan objek, bukan array.
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), mengingat array
dan callback
fungsi yang mengembalikan nilai kebenaran untuk elemen "benar":
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
Ingatlah bahwa ini tidak bekerja pada IE8-, karena tidak mendukung some
. Sebuah polyfill dapat disediakan, atau selalu ada for
loop klasik :
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
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.
Terpendek,
var theAnswerObj = _.findWhere(array, {id : 42});
Pertimbangkan "axesOptions" sebagai larik objek dengan format objek menjadi {: field_type => 2,: fields => [1,3,4]}
function getFieldOptions(axesOptions,choice){
var fields=[]
axesOptions.each(function(item){
if(item.field_type == choice)
fields= hashToArray(item.fields)
});
return fields;
}