2011-06-04 20 views
16
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}]; 

मैं डीबी कॉल, set.find({"color":"green"}) जैसे कुछ करने में सक्षम होना चाहता हूं और यह उस संपत्ति वाले सामानों से भरा एक सरणी वापस कर सकता हूं।वस्तुओं की एक सरणी में मिलान करने वाली वस्तुओं को ढूंढना?

+1

पहले से ही http://stackoverflow.com/questions/1820593/search-a-javascript-object –

+0

में दिए उदाहरण पूरी वस्तु वापस नहीं करता है यही कारण है कि , क्या यह? – fancy

+1

इसका jQuery के साथ कुछ लेना देना नहीं है, इसलिए आपको उस टैग को हटाना चाहिए। यह एक पूरी तरह से जावास्क्रिप्ट सवाल है। – Domenic

उत्तर

38

Array#filter का उपयोग करना, इस विशेष मामले के लिए कोड की तरह

var results = set.filter(function (entry) { return entry.color === "green"; }); 

Array#filter कुछ पुराने ब्राउज़र में लागू नहीं किया गया लगेगा, तो एक पश्चगामी संगतता शिम के लिए जुड़ा हुआ आलेख देखें, या बेहतर अभी तक a full-fledged ES5 shim मिलता है।

function findByMatchingProperties(set, properties) { 
    return set.filter(function (entry) { 
     return Object.keys(properties).every(function (key) { 
      return entry[key] === properties[key]; 
     }); 
    }); 
} 

var results = findByMatchingProperties(set, { color: "green" }); 

फिर से, मैं ECMAScript उपयोग कर रहा हूँ 5 तरीकों Object.keys और Array#every, इसलिए एक ES5 शिम का उपयोग करें:

अधिकतर सामान्य मामले के लिए, यह इस विचार का विस्तार का मामला है। (। कोड एक ES5 शिम के बिना संभव है लेकिन मैनुअल छोरों का उपयोग करता है और बहुत कम मज़ा लिखने और पढ़ने के लिए है)

+0

मुझे शुद्ध ES5 का उपयोग करने में कोई फर्क नहीं पड़ता, यह सर्वर पर है। – fancy

+4

यहां तक ​​कि वीरडर भी कि आप jQuery टैग सहित हैं। – Domenic

+0

यह एक विधि के रूप में क्या दिखता है? set.find ({रंग: "हरा"}), मूल रूप से गलत डीबी कार्यक्षमता बनाने के लिए देख रहे हैं। – fancy

2

जब से तुम jQuery टैग को शामिल किया है, यहाँ एक तरह से यह करने के लिए उपयोग कर रहा है jQuery के map:

var results = $.map(set, function(e,i){ 
    if(e.color === 'green') return e; 
}); 

प्रलेखन बताता है कि आपको सरणी से तत्व को हटाने के लिए null वापस करने की आवश्यकता है, लेकिन स्पष्ट रूप से यह झूठी है, जैसा टिप्पणियों में जेएसफ़िल्ड द्वारा दिखाया गया है; कुछ भी वापस नहीं लौटा रहा है (यानी undefined लौट रहा है) बस काम करता है।

+1

यह वापस लौटाएगा [अपरिभाषित, {रंग: "हरा"}, अपरिभाषित, अपरिभाषित] '। – Domenic

+0

@Domenic, http://jsfiddle.net/redler/FXRf8/ –

+1

@ केन रेडलर, मैं सही खड़ा हूं। '$ .map' के लिए प्रलेखन का कहना है कि यदि आप 'शून्य' वापस करते हैं तो यह केवल तत्व को हटा देगा, लेकिन मुझे लगता है कि यह 'अपरिभाषित' भी पहचानता है। फिर भी, मुझे लगता है कि आप आमतौर पर इसके लिए '$ .grep' का उपयोग करना चाहते हैं। – Domenic

0

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

var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }]; 

searchKey = 2 

var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }]; 
 

 
searchKey = 2 
 

 
var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)]; 
 

 
console.log(selectedData)

var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)]; 

console.log(selectedData) 

output 
{ name: "Shyam", Id: 2 } 

Note: if you want to pass search key as object then 
searchKey = { Id: 2 }; 

mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey.Id)]; 

output 
{ name: "Shyam", Id: 2 } 
संबंधित मुद्दे