jQuery

2013-01-09 8 views
6

के साथ मूल्य के लिए जावास्क्रिप्ट कुशल खोज सरणी यहां मेरे जावास्क्रिप्ट ज्ञान में एक अंतर है। मैं किसी विशेष मूल्य के लिए ऑब्जेक्ट मानों की एक सरणी खोजना चाहता हूं और इसे वापस कराना चाहता हूं।jQuery

साल मैं जावास्क्रिप्ट लिख दिया है के लिए, मैं इसे इस तरह लागू करने दिया गया है:

var itemClicked = (function(){ 

    var retval; 

    //Note self.inventory.itemsArray is an array of JS objects 

    $(self.inventory.itemsArray).each(function(i){ 
    if(parseInt(this.id) === parseInt(idOfItem)){ 
     retval = this; 
     return false; 
    } 
    }); 

    return retval; 

})(); 

यह काम करता है, लेकिन मैं एक और अधिक सुरुचिपूर्ण तरीका है कुछ भी रूप में यकीन है। कृपया मुझे बताओ!

संपादित करें - समाधान

धन्यवाद नीचे अपने जवाब के साथ @gdoron करने के लिए।

var myVar = $(self.owner.itemsArray).filter(function(){ 
    return parseInt(this.id) == parseInt(recItemID); 
}).get(0); 

नोट: .get(0) अंत में जोड़ी गई थी क्योंकि myVar एक jQuery वस्तु के रूप में लपेटा जाता है।

+0

परिभाषित करें "* अधिक कुशल *।" कुछ "* कम अक्षर *" – Alexander

+1

के साथ गलत समझा जाएगा तो 'self.inventory.itemsArray' चयनकर्ताओं या jQuery ऑब्जेक्ट्स की एक सरणी है? – elclanrs

+0

आईडी द्वारा आपके सरणी को इंडेक्स क्यों नहीं करें? उन्हें सिर्फ 'self self.inventory' करने की आवश्यकता है।आइटमअरे [आईडी] 'और पूरी तरह से लूप से बचें। –

उत्तर

14

इस के लिए देशी jQuery समारोह filter है:

$(data).filter(function(){ 
    return this.id == "foo"; 
}); 

यह कोड की तुलना में कम आप और अधिक महत्वपूर्ण एक बहुत अधिक पठनीय है।
दक्षता के बारे में, यह जितना संभव हो सके मैचों को खोजने के लिए सेट के सभी तत्वों को फिर से चालू करेगा, लेकिन मुझे शायद ही विश्वास है कि यह आपके आवेदन की बोतल गर्दन होगी, माइक्रो-ऑप्टिमाइज़ेशन पर ध्यान केंद्रित न करें।

मेरा सुझाव है कि आप Which is faster के बारे में एरिक लिपर ब्लॉग पढ़ें।

तुम भी grep रूप @Mattias Buelens ने सुझाव दिया उपयोग कर सकते हैं:

$.grep(data, function(ele){ 
    retun ele.id == "foo"; 
}); 
+3

जेक के मूल निवासी, भाषा के मूल निवासी नहीं। आप इसके बारे में और अधिक सटीक होना चाह सकते हैं। –

+2

@ गुस्ताफ्र, मुझे विश्वास है कि यह स्पष्ट है, लेकिन मैं इसे जोड़ दूंगा। – gdoron

+0

यह समाधान अनावश्यक रूप से एक jQuery ऑब्जेक्ट में सरणी को लपेटता है। फ़ंक्शन पास करते समय '$ .find' नक्शे' jQuery.grep' पर जाएं, इसलिए आप @ gruno द्वारा दिखाए गए अनुसार 'grep' का उपयोग करके बेहतर हो जाएं। –

0

हालांकि मैं अनिश्चित समारोह वास्तव में (बाहरी संदर्भों 'चर के कारण) करने के लिए माना जाता है क्या कर रहा हूँ, तो निम्न होना चाहिए अधिक कुशल चक्र के लिहाज से

var itemClicked = (function(){ 

    var i, array = self.inventory.itemsArray, length = array.length; 

    for(i=0; i < length; i++) { 

    if(parseInt(array[i].id) === parseInt(idOfItem)){ 
     return array[i]; 
    } 

    } 

    return undefined; 

})(); 
0

यह जावास्क्रिप्ट की एक सरणी वस्तुओं है

फिर jQuery का उपयोग न करें। कम से कम, सरणी के चारों ओर एक रैपर ऑब्जेक्ट बनाने के बजाय $.each का उपयोग करें। फिर भी, के लिए लूप एक सरल बहुत कम और अधिक performant है:

var itemClicked = (function(idnum) { 
    var arr = self.inventory.itemsArray; 
    for (var i=0, l=arr.length; i<l; i++) 
     if (parseInt(arr[i].id, 10) === idnum) 
      return arr[i]; 
})(parseInt(idOfItem, 10)); 

साथ ही आप, संख्या के रूप में आईडी गुण तुरंत संग्रहीत करने का विचार है ताकि आप इसे हर बार बदलने की आवश्यकता नहीं है हो सकता है।

4

बस एक और विकल्प का उपयोग कर jQuery के $.grep() समारोह

var arr = $.grep(self.inventory.itemsArray, function (n) { 
    return n.id == idOfItem; 
}); 

ऊपर रिटर्न सरणी तत्वों मिलान की एक सरणी। यदि आप पहले चाहते हैं तो यह arr[0] वापस आने के लिए पर्याप्त आसान है यदि यह मौजूद है।

+0

क्या पहले मेलिंग ऑब्जेक्ट की बजाय grep एक सरणी नहीं लौटाता है? – Bergi

+1

'$ .filter' के विपरीत,' jQuery.grep' अनावश्यक रूप से किसी jQuery ऑब्जेक्ट में सरणी को लपेट नहीं करता है। दोनों समाधान अभी भी * सभी * मिलान तत्वों को पाते हैं, हालांकि। मुझे मूल 'ऐरे' विधि या jQuery फ़ंक्शन नहीं मिल रहा है जो पहले मैच के बाद खोजना बंद कर सकता है। –

+0

@ मैटियासबुएलेंस, 'प्रत्येक' जब झूठी वापसी करता है तो पुनरावृत्तियों को रोकता है। हालांकि मैं अभी भी 'फ़िल्टर' का उपयोग करता हूं क्योंकि यह बहुत अधिक पठनीय है। – gdoron