जावास्क्रिप्ट ऑब्जेक्ट की एक सरणी में आईडी द्वारा ऑब्जेक्ट ढूंढें


1544

मुझे एक सरणी मिली है:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

मैं सरणी की संरचना को बदलने में असमर्थ हूं। मुझे एक आईडी पास की जा रही है 45, और मैं 'bar'उस ऑब्जेक्ट के लिए एरे में लाना चाहता हूं ।

मैं जावास्क्रिप्ट में या jQuery का उपयोग कैसे करूँ?

जवाबों:


1185

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 )।


2
कई परीक्षण स्थितियों के लिए यह कुछ इस तरह होगा: myArray.find (x => x.id === '45' && x.color == 'red')। foo
Apqu

2
मेरे लिए, अब तक का सबसे अच्छा जवाब। JQuery की जरूरत नहीं है और न ही नए रूपांतरित सरणियों का निर्माण।
कैंटा

myArray.find (x => x.id === '45') यह मैक पीसी पर काम नहीं करता है
गोविंदा राजभर

@TJCrowder मुझे नहीं लगता कि एमडीएन से पॉलीफ़िल को अपने कोड में कॉपी-पेस्ट करना एक अच्छा विचार है; इसके बजाय, आपको पॉलीफ़िल के साथ एनपीएम पैकेज का उपयोग करना चाहिए। और कोलाहल ES2015 + सुविधाओं के लिए polyfills, में शामिल नहीं है कोलाहल-polyfill पैकेज।
मिचेल पेरोलाकोव्स्की

2
myArray.find (x => x.id === '45')। foo; '45' की आईडी के साथ कोई वस्तु नहीं होने पर एक अपवाद फेंकता है।
फ्रेजर किर्कमैन

1465

जैसा कि आप पहले से ही 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
}

124
जावास्क्रिप्ट के ऑपरेटर के साथ अजीब मुद्दों से बचने के लिए ===इसके बजाय इसका उपयोग करना सुरक्षित होगा । ====
विक्की चिजवानी

11
@VickyChijwani: किसी स्ट्रिंग से स्ट्रिंग की तुलना करते समय कोई समस्या होती है?
गुफ्फा

38
ठीक है, अगर आप पूरी तरह से आश्वस्त हैं कि दोनों e.idऔर idतार होंगे, मुझे लगता है कि इसका उपयोग करना ठीक है ==। लेकिन अगर आप सुनिश्चित नहीं हैं, तो आप समस्याओं का सामना कर सकते हैं (के बाद से '' == 0है trueलेकिन '' === 0है false)। ऐसा ===प्रतीत नहीं होता है कि यह तेज़ हो रहा है ( stackoverflow.com/questions/359494/… )।
विक्की चिजवानी

101
मूल रूप से मैं हमेशा उपयोग ===करता हूं क्योंकि यह अन्य प्रोग्रामिंग भाषाओं की तरह ही काम करता है== । मैं ==जावास्क्रिप्ट में गैर-मौजूद माना जाता हूं ।
विक्की चिजवानी

6
@डे। यहां कई उत्तर अद्वितीय मूल्यों को देखते हुए इच्छित व्यवहार प्रदान करते हैं; आप अनिवार्य रूप से उन्हें इस तथ्य से पहचान सकते हैं कि वे अपने पाश से जल्दी लौटते हैं या टूट जाते हैं (या पुनरावृत्ति को रोकने के लिए निचले स्तर के निर्माण का निर्देश देते हैं)। एक कैनोनिकल उदाहरण के लिए जारेडपर का उत्तर और उसी अंतर्दृष्टि के लिए आरोनियस की टिप्पणी पर उत्तर देखें। सामान्य तौर पर, लोग "फ़िल्टर" और "फाइंड" कार्यों में इस तरह से अंतर करते हैं, लेकिन शब्दावली भिन्न होती है। हालांकि अधिक कुशल, यह अभी भी एक रेखीय खोज है, इसलिए यदि आप हैश तालिका का उपयोग करना चाहते हैं, तो हारून डिगुल्ला का उत्तर (निहितार्थों से सावधान रहें) देखें।
tne

362

लुकअप ऑब्जेक्ट बनाने के लिए एक और उपाय है:

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}

... now you can use lookup[id]...

यह विशेष रूप से दिलचस्प है यदि आपको कई लुकअप करने की आवश्यकता है।

आईडी और ऑब्जेक्ट साझा किए जाने के बाद से इसे अधिक मेमोरी की आवश्यकता नहीं होगी।


6
ठीक वही जो मेरे द्वारा खोजा जा रहा था। मजेदार यह है कि मैं कैसे प्रत्येक बार के माध्यम से लूप की कोशिश करके इसे अधिक जटिल करने की कोशिश कर रहा था, सूची में से प्रत्येक आइटम को हटा रहा था जैसा कि मैंने पाया जब मुझे केवल CouchDB से प्राप्त डेटा को म्यूट करने और इसे एक प्रारूप में प्राप्त करने की आवश्यकता थी जो मेरे लिए उपयोगी है की जरूरत है। +1 सर!
slickplaid

5
यह स्मार्ट है। मैं कल्पना नहीं कर सकता कि प्रत्येक उपयोग के लिए सभी सरणी को देखकर अन्य लोग कैसे आश्वस्त थे।
अलादीन ने

4
जब तक आप गुणों के क्रम पर भरोसा नहीं करते हैं: stackoverflow.com/questions/4886314/…
Marle1

एक ब्रेक का उपयोग कर रहा है; लूप में एक अच्छा विकल्प / सुधार यदि आप जानते हैं कि खोजने के लिए केवल एक ही वस्तु है?
irJvV

7
@irJvV: नहीं, इसका कोई मतलब नहीं है। यदि आपको कई लुकअप करने की आवश्यकता है, तो उपरोक्त कोड उपयोगी है। यदि आप सिर्फ एक बार देखते हैं, तो एक lookupवस्तु बनाना समय की बर्बादी है।
आरोन दिगुल्ला

174

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);

यह बाहरी पुस्तकालयों के बिना काम करता है। लेकिन अगर आप पुराने ब्राउज़र का समर्थन चाहते हैं तो आप इस पॉलीफ़िल को शामिल करना चाह सकते हैं ।


1
संभवतः इसका कारण अभी भी बहुत प्रायोगिक लगता है और बहुत सारे ब्राउज़र इसका समर्थन नहीं करते हैं। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
lejonl

2
इसे सरल बनाया जा सकता है myArray.find(d=>d.id===45).foo;
झबरा

1
@ शगुन या भी myArray.find(({ id }) => id === 45).foo। लेकिन यह एक पुराना उत्तर है जो ES2015 सिंटैक्स से पहले लिखा गया था और अब भी समर्थित है। @ गोठडो का जवाब वर्तमान में थ्रेड में सबसे ऊपर है।
रूनर बर्ग

1
@ शगुन अगर .find () अपरिभाषित रिटर्न देता है, तो आपका अनुकूलन एक त्रुटि फेंकता है। तो इस समाधान का उपयोग केवल उन मामलों में किया जा सकता है जहां एक मैच की गारंटी है।
हर्बर्ट पीटर्स

1
@HerbertPeters आप होना चाहते हैं सुनिश्चित करें कि आप अशक्त की जांच, जिसके साथ वास्तव में आसान हो जाएगा alway कर सकते हैं वैकल्पिक श्रृंखलन : myArray.find(d => d.id === 45)?.foo
रुनर बर्ग

141

Underscore.js के लिए एक अच्छी विधि है:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })

42
रिकॉर्ड के लिए, लो-डैश (जो अंडरस्कोर की तुलना में अक्सर अधिक प्रदर्शन करता है) में एक समान विधि है। डॉक्स यहाँ: lodash.com/docs#find
user456584

यदि आप केवल एक वस्तु की उम्मीद कर रहे हैं, तो खोज का उपयोग करना अधिक कुशल होगा क्योंकि एक परिणाम प्राप्त करने के बाद, खोज आगे नहीं बढ़ेगी।
4

@ फ़ॉरवर्ड की _ डॉक्स से: "जैसे ही यह स्वीकार्य तत्व पाता है, फ़ंक्शन वापस आ जाता है, और पूरी सूची को पार नहीं करता है।"
गिजजनबी

129

मुझे लगता है कि सबसे आसान तरीका निम्नलिखित होगा, लेकिन यह इंटरनेट एक्सप्लोरर 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?
इगोर Zinov'yev

@Igor Zinov'yev: हाँ, निश्चित रूप से उन ES5 सरणी उपकरणों के साथ प्रदर्शन प्रभाव हैं। प्रत्येक तत्व के लिए एक अलग फ़ंक्शन निष्पादित किया जाता है, इसलिए यह प्रत्यक्ष forलूप की तुलना में वास्तव में तेज़ नहीं होगा ।
pimvdb

तो आप कह रहे हैं कि यह धीमा होगा? इसके अलावा, यह हमेशा पूरे सरणी को स्कैन करेगा, जहां तक ​​मैं देख सकता हूं, जबकि forलूप पहले मैच पर समाप्त हो जाएगा।
इगोर Zinov'yev

यदि आपको IE8 के लिए समर्थन की आवश्यकता है, तो बस इसमें ड्रॉप करें: stackoverflow.com/questions/7153470/…
एडम ग्रांट

यदि कोई तत्व नहीं है, तो यह कोड एक त्रुटि को फेंक देगाid
स्टेन

71

निम्नलिखित का प्रयास करें

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;
}

17
यह अपने स्वयं के उत्तर के योग्य नहीं था, लेकिन आधुनिक ब्राउज़रों में इस समाधान को इस प्रकार लिखा जा सकता है: jsfiddle.net/rwaldron/j3vST
रिक

12
यदि आप दक्षता के लिए जा रहे हैं, तो ध्यान दें कि यह उदाहरण फ़िल्टर का उपयोग करने की तुलना में तेजी से संभव है () (रिक का उदाहरण देखें) क्योंकि यह एक बार मेल खाता पहला आइटम पाता है, जबकि फ़िल्टर () पूर्ण सरणी के माध्यम से चलने के बाद भी चलता रहता है मेल खाते हैं। यह भी एक अतिरिक्त सरणी बनाने या प्रत्येक आइटम के लिए एक फ़ंक्शन कॉल करने की लागत नहीं है।
एरोनियस

3
@ क्लिक करें, उस उत्तर के बारे में सबसे दिलचस्प बात यह है कि आप फायरबग कंसोल को jsFiddle में आउटपुट विंडो में जोड़ सकते हैं। यह लॉगिंग और आउटपुट को देखने के लिए कंसोल खोलने के लिए किसी और को बताने से बहुत बेहतर है। बहुत बढ़िया!
काइलमिट

1
चूंकि किसी ने अब तक इसका उल्लेख नहीं किया है, इसलिए मैं जोड़ना चाहता था कि AngularJS में एक फिल्टर विधि भी है ।
Eno



31

ऊपर 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');

15

आप मानचित्र () फ़ंक्शन का उपयोग करके इसे आसानी से प्राप्त कर सकते हैं :

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/


1
मैं इस तथ्य के बारे में भूल गया कि jQuery का है map स्वचालित रूप से nullतत्वों को हटा देता है। यह मेरे लिए और आम अवधारणा के लिए भ्रामक लगता है map, क्योंकि परिणाम मूल संग्रह की समान लंबाई का नहीं है।
मैक्सआर्ट

14

आप फ़िल्टर का उपयोग कर सकते हैं,

  function getById(id, myArray) {
    return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })[0]
  }

get_my_obj = getById(73, myArray);

1
@TobiasBeuving - Array.find () का उपयोग करने वाला एक सादा जेएस है और पहली खोज पर रुकना चाहिए ताकि यह अधिक कुशल हो।
एड्रियन लिंच

12

जबकि यहां कई सही उत्तर हैं, उनमें से कई इस तथ्य को संबोधित नहीं करते हैं कि यदि यह एक से अधिक बार किया जाता है तो यह एक अनावश्यक रूप से महंगा ऑपरेशन है। एक चरम मामले में यह वास्तविक प्रदर्शन समस्याओं का कारण हो सकता है।

वास्तविक दुनिया में, यदि आप बहुत सारी वस्तुओं का प्रसंस्करण कर रहे हैं और प्रदर्शन एक चिंता का विषय है तो शुरू में एक लुकअप बनाना बहुत तेज़ है:

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


11

देशी का उपयोग करना 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


बस एक नोट, IE8 और उसके नीचे Array.reduce समर्थित नहीं है।
Burn_E99

7

यदि आप कई बार ऐसा करते हैं, तो आप एक नक्शा (ES6) सेट कर सकते हैं:

const map = new Map( myArray.map(el => [el.id, el]) );

तो आप बस कर सकते हैं:

map.get(27).foo

6

यहां बताया गया है कि मैं इसके बारे में शुद्ध जावास्क्रिप्ट में कैसे जाऊंगा, सबसे न्यूनतम तरीके से मैं सोच सकता हूं कि 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'

5

अधिक सामान्य और संक्षिप्त

function findFromArray(array,key,value) {
        return array.filter(function (element) {
            return element[key] == value;
        }).shift();
}

आपके मामले में पूर्व। var element = findFromArray(myArray,'id',45)वह तुम्हें पूरा तत्व देगा।


4

आप http://sugarjs.com/ से सुगरजेस की कोशिश कर सकते हैं

यह पर सरणी एक बहुत प्यारा विधि है, .find। तो आप इस तरह एक तत्व पा सकते हैं:

array.find( {id: 75} );

आप एक और "गुण-खंड" को जोड़ने के लिए अधिक गुणों के साथ एक ऑब्जेक्ट पास कर सकते हैं।

ध्यान दें कि सुगरज देशी वस्तुओं का विस्तार करता है, और कुछ लोग इसे बहुत बुरा मानते हैं ...


2
खैर, यह है बुराई है, क्योंकि यह भी हो सकता है नए ECMAScript संस्करणों में एक ही नाम के साथ नए तरीकों को लागू कर सकते हैं। और लगता है क्या, यह वास्तव में क्या हुआ हैfind । मेरा सुझाव यह है कि यदि आप मूल प्रोटोटाइप का विस्तार करना चाहते हैं, तो हमेशा अधिक विशिष्ट नामों का उपयोग करें, सरलतम को भविष्य के मानक विकास के लिए छोड़ दें।
मैक्सर्ट

यह टिप्पणी लगभग 2 साल पुरानी है और आज मैं किसी भी तरह से लॉश का उपयोग करूंगा। हालाँकि यदि आप चाहें तो आप इस विषय के बारे में शुगर वेबसाइट पर पढ़ सकते हैं। वे आपकी राय पर एक अच्छा रुख अपनाते हैं
deepflame

1
ऑप ने विशेष रूप से एक जावास्क्रिप्ट या jquery समाधान के लिए पूछा
तोबियास बीयूविंग

4

स्वीकृत उत्तर पर निर्माण:

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

4

हाल ही में, मुझे उसी चीज़ का सामना करना पड़ा है जिसमें मुझे एक विशाल सरणी से स्ट्रिंग को खोजने की आवश्यकता है।

कुछ खोज के बाद मैंने पाया कि सरल कोड को संभालना आसान होगा:

कोड:

var items = mydata.filter(function(item){
    return item.word.toLowerCase().startsWith( 'gk );
})

Https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/ देखें

20k तार से Serach


3

सरणी में किसी भी आइटम पर 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];
}

3

जब तक ब्राउज़र ECMA-262 , 5th संस्करण (दिसंबर 2009) का समर्थन करता है , तब तक यह काम करना चाहिए, लगभग एक-लाइनर:

var bFound = myArray.some(function (obj) {
    return obj.id === 45;
});

2
लगभग। bFoundबस एक बूलियन है जो trueiff एक तत्व आवश्यक स्थिति को संतुष्ट करता है।
मैक्सआर्ट

3

सरणियों के लिए अंतर्निहित "फ़िल्टर" फ़ंक्शन का उपयोग करके आप शुद्ध जावास्क्रिप्ट में भी ऐसा कर सकते हैं:

Array.prototype.filterObjects = function(key, value) {
    return this.filter(function(x) { return x[key] === value; })
}

तो अब बस के स्थान पर "आईडी" keyऔर "45" के स्थान पर पास करें value, और आपको 45 की आईडी से मिलान करने वाली पूरी वस्तु मिल जाएगी। इसलिए यह होगा,

myArr.filterObjects("id", "45");

16
उन वस्तुओं को संशोधित न करें, जिनके आप स्वामी नहीं हैं।
मिचेल पेरोलाकोव्स्की

3

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.infovar getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
सुमित रिद्धल

तुम es6 शैली भी imo का उपयोग कर सकते हैं ... const filterData = jsonObj.filter (obj => obj.name === 'एलेक्स')
DagicCross

3

हम 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 का उपयोग करें


2

मुझे वास्तव में हारून दिगुल्ला द्वारा प्रदान किया गया उत्तर पसंद आया लेकिन बाद में इसके माध्यम से पुनरावृति हो सके, इसलिए मुझे अपनी वस्तुओं को रखने की आवश्यकता थी। इसलिए मैंने इसे संशोधित किया

	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


सरणी में आइटम खोजने के लिए सबसे तेज़ के रूप में एक ही समाधान का उपयोग किया। लेकिन parseInt यहाँ बेमानी है।
आलेहा

1

उपयोग:

var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {

        if (obj.id === '5') { // id.toString() if it is int

            retObj = obj;
            return false;
        }
    });
return retObj;

यह आईडी द्वारा एक वस्तु वापस करना चाहिए।


आप वापसी obj.id === 5 का उपयोग करके अपने कोड को छोटा कर सकते हैं? obj: झूठी; मैं सरणियों पर पुनरावृत्ति के लिए $ .each का बहुत उपयोग करता हूं।
मार्सेल

@marcel: यह काम नहीं करेगा। जैसा कि झूठे लौटने से पाश समाप्त हो जाएगा, यह केवल ऑब्जेक्ट को ढूंढेगा यदि यह सरणी में पहला आइटम था।
गुफा

1

यह समाधान उपयोगी हो सकता है:

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और यदि एक वस्तु का पता चलता है, तो फ़ंक्शन एक सरणी के बजाय ऑब्जेक्ट को वापस कर देगा।


2
उन वस्तुओं को संशोधित न करें, जिनके आप स्वामी नहीं हैं।
मिचेल पेरोलाकोव्स्की

@ गोथो I सहमत। अगर किसी को नहीं पता था कि function will return the object, rather than an arrayगलती हो सकती है, लेकिन मुझे लगता है कि यह उपयोगकर्ताओं पर निर्भर करता है।
सूदखोर

0

एगटन के जवाब से शुरू , यह एक ऐसा फ़ंक्शन है जो वास्तव में वांछित तत्व (या 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;
});

यह वास्तव में तेज और अधिक कॉम्पैक्ट है। लेकिन अगर आप पहिया को फिर से मजबूत नहीं करना चाहते हैं, तो मैं सुझाव देता हूं कि अंडरस्कोर या लॉश जैसे एक उपयोगिता पुस्तकालय का उपयोग करें।


0

कम से कम,

var theAnswerObj = _.findWhere(array, {id : 42});

1
इसके लिए अंडरस्कोर लाइब्रेरी का उपयोग करने की आवश्यकता होती है, ओपी ने एक सादे जावास्क्रिप्ट या jQuery समाधान के लिए कहा
तोबियास बीइंग

2
एक बार जब आप अंडरस्कोर शामिल करते हैं, तो यह एक छोटा जवाब नहीं है!
टिम ओगिल्वी

-1

किसी वस्तु प्रारूप वाली वस्तुओं के सरणी होने के लिए "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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.