Yanıtlar:
find()
Yöntemi kullanın :
myArray.find(x => x.id === '45').foo;
Gönderen MDN'yi :
find()
Yöntem olup, dizideki ilk değerini verir dizi tatmin bir eleman temin test fonksiyonu ise. Aksi takdirdeundefined
iade edilir.
Bunun yerine dizinini bulmak istiyorsanız , şunu kullanın findIndex()
:
myArray.findIndex(x => x.id === '45');
Gönderen MDN'yi :
findIndex()
Yöntem tatmin test fonksiyonu şu şartla ki dizideki ilk elemanın dizinini döndürür. Aksi takdirde -1 döndürülür.
Eşleşen öğeler dizisi almak istiyorsanız, filter()
bunun yerine yöntemi kullanın:
myArray.filter(x => x.id === '45');
Bu bir dizi nesne döndürür. Bir dizi foo
özellik almak istiyorsanız, bunu map()
yöntemle yapabilirsiniz:
myArray.filter(x => x.id === '45').map(x => x.foo);
Yan not: gibi yöntemler find()
veya filter()
, ve ok fonksiyonları böylece bu tarayıcılar desteklemek istiyorlarsa, kullanmakta kodunuzu transpile gerektiğini (IE gibi) daha eski tarayıcılar tarafından desteklenmez Babel (ile Polyfill ).
Zaten jQuery kullandığınız gibi, bir dizi aramak için tasarlanmış grep işlevini kullanabilirsiniz :
var result = $.grep(myArray, function(e){ return e.id == id; });
Sonuç, bulunan öğelerin bulunduğu bir dizidir. Nesnenin her zaman orada olduğunu ve yalnızca bir kez oluştuğunu biliyorsanız result[0].foo
, değeri elde etmek için kullanabilirsiniz . Aksi takdirde, elde edilen dizinin uzunluğunu kontrol etmelisiniz. Misal:
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
}
===
yerine kullanmak daha güvenli olacaktır . ==
==
e.id
ve id
dizeleri olacak, kullanımı 's OK varsayalım ==
. Eğer emin değilseniz (çünkü Ama, sorunlar olabilir '' == 0
olduğunu true
ama '' === 0
olan false
). Bahsetmemek ===
daha hızlı görünüyor ( stackoverflow.com/questions/359494/… ).
===
çalışır çünkü tam gibi ==
diğer programlama dillerinde. ==
JavaScript'te var olmadığını düşünüyorum .
Başka bir çözüm, bir arama nesnesi oluşturmaktır:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
Birçok arama yapmanız gerekiyorsa bu özellikle ilginçtir.
Kimlikler ve nesneler paylaşılacağı için bunun daha fazla belleğe ihtiyacı yoktur.
lookup
nesne oluşturmak zaman kaybıdır.
ECMAScript 2015 , dizilerde find () yöntemini sağlar:
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);
Harici kütüphaneler olmadan çalışır. Ancak daha eski tarayıcı desteği istiyorsanız, bu çoklu dolguyu dahil etmek isteyebilirsiniz .
myArray.find(d=>d.id===45).foo;
.
myArray.find(({ id }) => id === 45).foo
. Ancak bu, ES2015 sözdiziminin şu ana kadar desteklenmesinden önce yazılmış eski bir cevaptır. @ Gothdo'nun cevabı şu anda konunun en güncel olanı.
myArray.find(d => d.id === 45)?.foo
.
Underscore.js bunun için güzel bir yöntem var:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
Bence en kolay yol şu olurdu, ancak Internet Explorer 8 (veya daha önceki sürümlerde) çalışmaz:
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
mı?
for
döngüye kıyasla gerçekten hızlı olmaz .
for
döngü ilk maçta sona erecek.
id
Takip etmeyi dene
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]
Yukarıdaki findById işlevinin genel ve daha esnek bir sürümü:
// 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');
Map () işlevini kullanarak bunu kolayca alabilirsiniz :
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";
Çalışma örneği: http://jsfiddle.net/hunter/Pxaua/
map
JQuery'nin null
öğeleri otomatik olarak kaldırdığını unuttum . map
Sonuç, orijinal koleksiyonla aynı uzunlukta olmadığından, bana ve ortak kavramına yanıltıcı geliyor .
Filtreleri kullanabilirsiniz,
function getById(id, myArray) {
return myArray.filter(function(obj) {
if(obj.id == id) {
return obj
}
})[0]
}
get_my_obj = getById(73, myArray);
Burada birçok doğru cevap olsa da, birçoğu birden fazla yapılırsa bunun gereksiz bir pahalı işlem olduğu gerçeğini ele almaz. Aşırı bir durumda, bu gerçek performans sorunlarının nedeni olabilir.
Gerçek dünyada, çok fazla öğe işliyorsanız ve performans bir endişe kaynağıysa, başlangıçta bir arama oluşturmak çok daha hızlıdır:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
daha sonra şu şekilde sabit zamanda ürün alabilirsiniz:
var bar = o[id];
Arama olarak nesne yerine bir Harita kullanmayı da düşünebilirsiniz: 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)
});
bulunursa nesne öğesini döndürür, aksi takdirde false
Bunu birden çok kez yaparsanız, bir Harita (ES6) oluşturabilirsiniz:
const map = new Map( myArray.map(el => [el.id, el]) );
Sonra şunları yapabilirsiniz:
map.get(27).foo
ECMAScript 3 veya daha sonraki sürümlerde çalıştığını düşünebileceğim en az şekilde saf JavaScript ile nasıl başlayacağım. Bir eşleşme bulunur bulunmaz geri döner.
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'
Daha genel ve kısa
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
sizin durumunuzda Örn. var element = findFromArray(myArray,'id',45)
size bütün elementi verecektir.
Sugarj'ları http://sugarjs.com/ adresinden deneyebilirsiniz. .
Dizilerde çok tatlı bir yöntemi var .find
. Böylece böyle bir eleman bulabilirsiniz:
array.find( {id: 75} );
Başka bir "where-cümlesi" eklemek için daha fazla özelliğe sahip bir nesne de iletebilirsiniz.
Sugarjs'ın yerel nesneleri genişlettiğini ve bazı insanların bunu çok kötü düşündüğünü unutmayın ...
find
, tam olarak olan buydu . Benim önerim, yerel prototipleri genişletmek istiyorsanız, her zaman daha spesifik isimler kullanın ve en basit olanları gelecekteki standart gelişmelere bırakın.
Kabul edilen cevaba dayanarak:
jQuery:
var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)
Veya CoffeeScript:
foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo
Son zamanlarda, ben büyük bir dizeden dize aramak için gereken aynı şeyle yüzleşmek zorunda.
Biraz arama yaptıktan sonra basit kodla işlem yapmak kolay olacak:
Kod:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
Dizideki herhangi bir öğenin üzerinde yineleme. Ziyaret ettiğiniz her öğe için o öğenin kimliğini kontrol edin. Bir eşleşme varsa, iade edin.
Sadece codez istiyorsanız:
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
}
Aynı şey ECMAScript 5'in Array yöntemlerini kullanarak:
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];
}
Diziler için yerleşik "filtre" işlevini kullanarak bunu saf JavaScript'te bile yapabilirsiniz:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
Yani şimdi yerine "id" ve yerine key
"45" value
iletin ve tam nesnenin 45 id ile eşleşmesini sağlayın. Böylece,
myArr.filterObjects("id", "45");
Array.prototype.filter()
Fonksiyonu kullanın .
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
}
}
];
FİLTRE
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
yöntemi kullan obj.info
. var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Jquery yöntemlerini kullanabiliriz $.each()/$.grep()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
veya
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
ES6 sözdizimini kullanın:
Array.find, Array.filter, Array.forEach, Array.map
Veya Lodash'ı kullanın https://lodash.com/docs/4.17.10#filter , Alt çizgi https://underscorejs.org/#filter
Aaron Digulla tarafından verilen cevabı gerçekten beğendim ama daha sonra tekrarlayabilmem için nesneler dizimi saklamam gerekiyordu. Ben de değiştirdim
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
kullanın:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
Bir nesneyi id ile döndürmelidir.
Bu çözüm de yardımcı olabilir:
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");
Tıpkı benim gibi yaptım $.grep
ve bir nesne bulunursa, işlev bir dizi yerine nesneyi döndürecektir.
function will return the object, rather than an array
bir hata alabilir, ancak bunun kullanıcılara bağlı olduğunu düşünüyorum.
Başlayarak aggaton cevabı , bu aslında (ya da istediği elemanı döndüren bir işlevdir null
bulunamadı değilse), verilen array
ve bir callback
döner "doğru" öğesi için bir truthy değeri o fonksiyonu:
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
Unutmayın, bu desteklemediği için IE8'de yerel olarak çalışmaz some
. Bir çoklu dolgu sağlanabilir, alternatif olarak her zaman klasik for
döngü vardır:
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
Aslında daha hızlı ve daha kompakt. Ancak tekerleği yeniden icat etmek istemiyorsanız, alt çizgi veya lodash gibi bir yardımcı program kütüphanesi kullanmanızı öneririm.
En kısa,
var theAnswerObj = _.findWhere(array, {id : 42});
"AxesOptions" öğesini, nesne formatı {: field_type => 2,: fields => [1,3,4]} olan bir nesne dizisi olarak düşünün
function getFieldOptions(axesOptions,choice){
var fields=[]
axesOptions.each(function(item){
if(item.field_type == choice)
fields= hashToArray(item.fields)
});
return fields;
}