जवाबों:
find()
विधि का प्रयोग करें :
myArray.find(x => x.id === '45').foo;
से MDN :
find()
विधि, सरणी में पहले मान देता है यदि सरणी संतुष्ट में एक तत्व प्रदान की परीक्षण कार्य करते हैं। अन्यथाundefined
वापस कर दिया जाता है।
यदि आप इसके बजाय इसका सूचकांक ढूंढना चाहते हैं , तो उपयोग करें findIndex()
:
myArray.findIndex(x => x.id === '45');
से MDN :
findIndex()
विधि सरणी में पहला तत्व के सूचकांक रिटर्न कि संतुष्ट परीक्षण समारोह प्रदान की है। अन्यथा -1 वापस कर दिया जाता है।
यदि आप मिलान तत्वों की एक सरणी प्राप्त करना चाहते हैं, तो filter()
इसके बजाय विधि का उपयोग करें :
myArray.filter(x => x.id === '45');
यह ऑब्जेक्ट की एक सरणी लौटाएगा। यदि आप foo
गुणों की एक सरणी प्राप्त करना चाहते हैं, तो आप इस map()
विधि से कर सकते हैं :
myArray.filter(x => x.id === '45').map(x => x.foo);
साइड नोट: जैसे तरीकों find()
या filter()
, और तीर कार्यों पुराने ब्राउज़र (आईई) की तरह द्वारा समर्थित नहीं हैं, इसलिए अगर आप इन ब्राउज़र का समर्थन करना चाहते हैं, तो आप अपने कोड का उपयोग transpile चाहिए कोलाहल (साथ polyfill )।
जैसा कि आप पहले से ही jQuery का उपयोग कर रहे हैं, आप grep फ़ंक्शन का उपयोग कर सकते हैं, जो किसी सरणी को खोजने के लिए है:
var result = $.grep(myArray, function(e){ return e.id == id; });
परिणाम एक सरणी है जिसमें आइटम पाए जाते हैं। यदि आप जानते हैं कि ऑब्जेक्ट हमेशा रहता है और यह केवल एक बार होता है, तो आप केवल result[0].foo
मूल्य प्राप्त करने के लिए उपयोग कर सकते हैं । अन्यथा आपको परिणामी सरणी की लंबाई की जांच करनी चाहिए। उदाहरण:
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
}
===
इसके बजाय इसका उपयोग करना सुरक्षित होगा । ==
==
e.id
और id
तार होंगे, मुझे लगता है कि इसका उपयोग करना ठीक है ==
। लेकिन अगर आप सुनिश्चित नहीं हैं, तो आप समस्याओं का सामना कर सकते हैं (के बाद से '' == 0
है true
लेकिन '' === 0
है false
)। ऐसा ===
प्रतीत नहीं होता है कि यह तेज़ हो रहा है ( stackoverflow.com/questions/359494/… )।
===
करता हूं क्योंकि यह अन्य प्रोग्रामिंग भाषाओं की तरह ही काम करता है==
। मैं ==
जावास्क्रिप्ट में गैर-मौजूद माना जाता हूं ।
लुकअप ऑब्जेक्ट बनाने के लिए एक और उपाय है:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
यह विशेष रूप से दिलचस्प है यदि आपको कई लुकअप करने की आवश्यकता है।
आईडी और ऑब्जेक्ट साझा किए जाने के बाद से इसे अधिक मेमोरी की आवश्यकता नहीं होगी।
lookup
वस्तु बनाना समय की बर्बादी है।
ECMAScript 2015 सरणियों पर खोज () विधि प्रदान करता है :
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);
यह बाहरी पुस्तकालयों के बिना काम करता है। लेकिन अगर आप पुराने ब्राउज़र का समर्थन चाहते हैं तो आप इस पॉलीफ़िल को शामिल करना चाह सकते हैं ।
myArray.find(d=>d.id===45).foo;
।
myArray.find(d => d.id === 45)?.foo
।
Underscore.js के लिए एक अच्छी विधि है:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
मुझे लगता है कि सबसे आसान तरीका निम्नलिखित होगा, लेकिन यह इंटरनेट एक्सप्लोरर 8 (या इससे पहले) पर काम नहीं करेगा:
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
लूप की तुलना में वास्तव में तेज़ नहीं होगा ।
for
लूप पहले मैच पर समाप्त हो जाएगा।
id
निम्नलिखित का प्रयास करें
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]
ऊपर FindById फ़ंक्शन का एक सामान्य और अधिक लचीला संस्करण:
// 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');
आप मानचित्र () फ़ंक्शन का उपयोग करके इसे आसानी से प्राप्त कर सकते हैं :
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";
काम करने का उदाहरण: http://jsfiddle.net/hunter/Pxaua/
map
स्वचालित रूप से null
तत्वों को हटा देता है। यह मेरे लिए और आम अवधारणा के लिए भ्रामक लगता है map
, क्योंकि परिणाम मूल संग्रह की समान लंबाई का नहीं है।
आप फ़िल्टर का उपयोग कर सकते हैं,
function getById(id, myArray) {
return myArray.filter(function(obj) {
if(obj.id == id) {
return obj
}
})[0]
}
get_my_obj = getById(73, myArray);
जबकि यहां कई सही उत्तर हैं, उनमें से कई इस तथ्य को संबोधित नहीं करते हैं कि यदि यह एक से अधिक बार किया जाता है तो यह एक अनावश्यक रूप से महंगा ऑपरेशन है। एक चरम मामले में यह वास्तविक प्रदर्शन समस्याओं का कारण हो सकता है।
वास्तविक दुनिया में, यदि आप बहुत सारी वस्तुओं का प्रसंस्करण कर रहे हैं और प्रदर्शन एक चिंता का विषय है तो शुरू में एक लुकअप बनाना बहुत तेज़ है:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
फिर आप निश्चित समय में इस तरह से आइटम प्राप्त कर सकते हैं:
var bar = o[id];
आप किसी वस्तु को देखने के बजाय मानचित्र का उपयोग करने पर भी विचार कर सकते हैं: 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)
});
यदि पाया गया है, तो वस्तु तत्व को लौटाता है false
यदि आप कई बार ऐसा करते हैं, तो आप एक नक्शा (ES6) सेट कर सकते हैं:
const map = new Map( myArray.map(el => [el.id, el]) );
तो आप बस कर सकते हैं:
map.get(27).foo
यहां बताया गया है कि मैं इसके बारे में शुद्ध जावास्क्रिप्ट में कैसे जाऊंगा, सबसे न्यूनतम तरीके से मैं सोच सकता हूं कि ECMAScript 3 या उसके बाद के कार्यों में। जैसे ही कोई मैच मिलता है यह वापस आ जाता है।
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'
अधिक सामान्य और संक्षिप्त
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
आपके मामले में पूर्व। var element = findFromArray(myArray,'id',45)
वह तुम्हें पूरा तत्व देगा।
आप http://sugarjs.com/ से सुगरजेस की कोशिश कर सकते हैं ।
यह पर सरणी एक बहुत प्यारा विधि है, .find
। तो आप इस तरह एक तत्व पा सकते हैं:
array.find( {id: 75} );
आप एक और "गुण-खंड" को जोड़ने के लिए अधिक गुणों के साथ एक ऑब्जेक्ट पास कर सकते हैं।
ध्यान दें कि सुगरज देशी वस्तुओं का विस्तार करता है, और कुछ लोग इसे बहुत बुरा मानते हैं ...
find
। मेरा सुझाव यह है कि यदि आप मूल प्रोटोटाइप का विस्तार करना चाहते हैं, तो हमेशा अधिक विशिष्ट नामों का उपयोग करें, सरलतम को भविष्य के मानक विकास के लिए छोड़ दें।
स्वीकृत उत्तर पर निर्माण:
jQuery:
var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)
या कॉफीस्क्रिप्ट:
foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo
हाल ही में, मुझे उसी चीज़ का सामना करना पड़ा है जिसमें मुझे एक विशाल सरणी से स्ट्रिंग को खोजने की आवश्यकता है।
कुछ खोज के बाद मैंने पाया कि सरल कोड को संभालना आसान होगा:
कोड:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
सरणी में किसी भी आइटम पर Iterate करें। आपके द्वारा देखे जाने वाले प्रत्येक आइटम के लिए, उस आइटम की आईडी देखें। यदि यह एक मैच है, तो इसे वापस कर दें।
अगर आप सिर्फ तेह कोड चाहते हैं:
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
}
और 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];
}
सरणियों के लिए अंतर्निहित "फ़िल्टर" फ़ंक्शन का उपयोग करके आप शुद्ध जावास्क्रिप्ट में भी ऐसा कर सकते हैं:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
तो अब बस के स्थान पर "आईडी" key
और "45" के स्थान पर पास करें value
, और आपको 45 की आईडी से मिलान करने वाली पूरी वस्तु मिल जाएगी। इसलिए यह होगा,
myArr.filterObjects("id", "45");
Array.prototype.filter()
फ़ंक्शन का उपयोग करें ।
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
}
}
];
फ़िल्टर
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
विधि का उपयोग करें obj.info
। var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
हम Jquery विधियों का उपयोग कर सकते हैं $.each()/$.grep()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
या
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
ES6 सिंटैक्स का उपयोग करें:
Array.find, Array.filter, Array.forEach, Array.map
या Lodash https://lodash.com/docs/4.17.10#filter , अंडरस्कोर https://underscorejs.org/#filter का उपयोग करें
मुझे वास्तव में हारून दिगुल्ला द्वारा प्रदान किया गया उत्तर पसंद आया लेकिन बाद में इसके माध्यम से पुनरावृति हो सके, इसलिए मुझे अपनी वस्तुओं को रखने की आवश्यकता थी। इसलिए मैंने इसे संशोधित किया
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
उपयोग:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
यह आईडी द्वारा एक वस्तु वापस करना चाहिए।
यह समाधान उपयोगी हो सकता है:
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");
मैंने इसे वैसे ही बनाया है $.grep
और यदि एक वस्तु का पता चलता है, तो फ़ंक्शन एक सरणी के बजाय ऑब्जेक्ट को वापस कर देगा।
function will return the object, rather than an array
गलती हो सकती है, लेकिन मुझे लगता है कि यह उपयोगकर्ताओं पर निर्भर करता है।
एगटन के जवाब से शुरू , यह एक ऐसा फ़ंक्शन है जो वास्तव में वांछित तत्व (या null
यदि नहीं मिला है), "सही" तत्व के लिए एक सत्य मान लौटाता है array
और दिया गया एक callback
फ़ंक्शन देता है:
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
बस याद रखें कि यह IE8 पर मूल रूप से काम नहीं करता है, क्योंकि यह समर्थन नहीं करता है some
। एक पॉलीफ़िल प्रदान किया जा सकता है, वैकल्पिक रूप से हमेशा क्लासिक for
लूप होता है:
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
यह वास्तव में तेज और अधिक कॉम्पैक्ट है। लेकिन अगर आप पहिया को फिर से मजबूत नहीं करना चाहते हैं, तो मैं सुझाव देता हूं कि अंडरस्कोर या लॉश जैसे एक उपयोगिता पुस्तकालय का उपयोग करें।
कम से कम,
var theAnswerObj = _.findWhere(array, {id : 42});
किसी वस्तु प्रारूप वाली वस्तुओं के सरणी होने के लिए "axesOptions" पर विचार करें: {: field_type => 2,: फ़ील्ड => [1,3,4]}
function getFieldOptions(axesOptions,choice){
var fields=[]
axesOptions.each(function(item){
if(item.field_type == choice)
fields= hashToArray(item.fields)
});
return fields;
}