Am'am luat-o matrice:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
Am'm în imposibilitatea de a schimba structura de matrice. Am'm a fi trecut un id de 45
, și vreau să - 'bar' pentru acel obiect în matrice.
Cum pot face acest lucru în JavaScript sau folosind jQuery?
Ca tine sunt deja folosind jQuery, puteți utiliza grep funcția care este destinat pentru căutarea unei matrice:
var result = $.grep(myArray, function(e){ return e.id == id; });
Rezultatul este o matrice cu elementele găsite. Dacă știi că obiectul este întotdeauna acolo și că are loc o singură dată, puteți folosi doar rezultat[0].foo
pentru a obține valoarea. În caz contrar, ar trebui să verificați lungimea array. Exemplu:
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
}
Utilizați găsim()` metoda:
myArray.find(x => x.id === '45').foo;
De MDN:
pentru () metoda returnează prima valoare din serie, dacă un element din matrice îndeplinește condiția funcția de testare. În caz contrar, "nedefinit" este returnat.
Dacă doriți să găsiți sale index în schimb, folosesc findIndex()`:
myArray.findIndex(x => x.id === '45');
Din MDN:
`findIndex () metoda returnează indicele primului element din matrice care satisface condiția funcția de testare. În caz contrar, -1 este returnat.
Dacă doriți să obțineți o serie de elemente de potrivire, de a folosi filter()
metoda în loc:
myArray.filter(x => x.id === '45');
Acest lucru va returna un array de obiecte. Dacă doriți să obțineți o serie de " foo " properties, puteți face acest lucru cu map()
metoda:
myArray.filter(x => x.id === '45').map(x => x.foo);
Notă: metode ca find () " sau " filtru()
, iar săgeată functions nu sunt acceptate de browsere mai vechi (ca de EXEMPLU), deci, dacă doriți pentru a sprijini aceste browsere, ar trebui să transpile codul folosind Babel (cu polyfill).
O altă soluție este de a crea un obiect de căutare:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
Acest lucru este deosebit de interesant dacă aveți nevoie să faceți mai multe căutări.
Asta nu't nevoie de mult mai mult de memorie de la Id-uri si obiecte vor fi partajate.
ECMAScript 2015 oferă find() metoda de pe tablouri:
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);
Acesta funcționează fără biblioteci externe. Dar dacă vrei browser mai vechi suport s-ar putea dori să includă acest polyfill.
Cred că cel mai simplu mod ar fi următoarele, dar nu o't de lucru pe Internet Explorer 8 (sau mai devreme):
var result = myArray.filter(function(v) {
return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property
Un generic și mai flexibil versiune a findById funcție de mai sus:
// 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');
Puteți obține cu ușurință folosind map() funcția:
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";
Exemplu de lucru:
În timp ce există multe răspunsuri corecte aici, multe dintre ele nu se referă la faptul că acesta este un mod inutil operație costisitoare dacă face mai mult decât o dată. Într-un caz extrem ar putea fi cauza reale probleme de performanță.
În lumea reală, dacă sunteți de prelucrare o mulțime de elemente și de performanță este un motiv de îngrijorare it's mult mai rapid pentru a construi inițial o căutare de:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
puteți obține apoi la elementele din timp fix ca asta :
var bar = o[id];
S-ar putea, de asemenea, luați în considerare utilizarea o Hartă în loc de un obiect ca de căutare: 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)
});
returnează obiectul element dacă este găsit, altfel "false"
Dacă veți face acest lucru de mai multe ori, s-ar putea configura o Hartă (ES6):
const map = new Map( myArray.map(el => [el.id, el]) );
Apoi, puteți face pur și simplu:
map.get(27).foo
Aici's cum am'd meargă despre asta în pură JavaScript, în cele mai manieră minimală care funcționează în Valoare de 3 sau mai târziu. Se întoarce cât mai curând un meci este găsit.
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'
Mai generic și scurt
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
în caz Ex. var element = findFromArray(myArray,'id',45)
care va oferi întregul element.
Puteți încerca Sugarjs de http://sugarjs.com/.
Ea are o foarte dulce metoda pe Tablouri, .găsi
. Astfel încât să puteți găsi un element astfel:
array.find( {id: 75} );
Puteți trece, de asemenea, un obiect cu mai multe proprietăți pentru a-l pentru a adăuga un alt "unde-clauza".
Rețineți că Sugarjs se extinde obiectele native, și unii oameni considera acest lucru foarte rău...
Puteți face acest lucru chiar și în pură JavaScript, cu ajutorul construit în "filtru" funcție pentru tablouri:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
Deci, acum trece pur și simplu "id" în loc de "cheie" și "45" în loc de "valoare", și veți obține complet obiect de potrivire un id de 45 de ani. Deci asta ar fi,
myArr.filterObjects("id", "45");