हां, Array.map() या $.map() वही काम करता है।
//array.map:
var ids = this.fruits.map(function(v){
return v.Id;
});
//jQuery.map:
var ids2 = $.map(this.fruits, function (v){
return v.Id;
});
console.log(ids, ids2);
http://jsfiddle.net/NsCXJ/1/
के बाद से array.map पुराने ब्राउज़र में समर्थित नहीं है, मेरा सुझाव है कि आप jQuery विधि के साथ चिपके रहते हैं।
यदि आप किसी अन्य कारण से दूसरे को पसंद करते हैं तो आप हमेशा पुराने ब्राउजर समर्थन के लिए पॉलीफिल जोड़ सकते हैं।
तुम हमेशा के रूप में अच्छी सरणी प्रोटोटाइप करने के लिए कस्टम तरीकों जोड़ सकते हैं:
Array.prototype.select = function(expr){
var arr = this;
//do custom stuff
return arr.map(expr); //or $.map(expr);
};
var ids = this.fruits.select(function(v){
return v.Id;
});
समारोह निर्माता का उपयोग करता है अगर आप एक स्ट्रिंग पारित एक विस्तारित संस्करण। कुछ शायद के साथ चारों ओर खेलने के लिए:
Array.prototype.select = function(expr){
var arr = this;
switch(typeof expr){
case 'function':
return $.map(arr, expr);
break;
case 'string':
try{
var func = new Function(expr.split('.')[0],
'return ' + expr + ';');
return $.map(arr, func);
}catch(e){
return null;
}
break;
default:
throw new ReferenceError('expr not defined or not supported');
break;
}
};
console.log(fruits.select('x.Id'));
http://jsfiddle.net/aL85j/
अद्यतन:
इस के बाद से इस तरह के एक लोकप्रिय जवाब बन गया है, मैं इसी तरह मेरे where()
+ firstOrDefault()
जोड़ रहा। ये भी स्ट्रिंग आधारित समारोह निर्माता दृष्टिकोण के साथ इस्तेमाल किया जा सकता है (जो सबसे तेज है), लेकिन यहाँ एक वस्तु फिल्टर के रूप में शाब्दिक का उपयोग कर एक और तरीका है:
Array.prototype.where = function (filter) {
var collection = this;
switch(typeof filter) {
case 'function':
return $.grep(collection, filter);
case 'object':
for(var property in filter) {
if(!filter.hasOwnProperty(property))
continue; // ignore inherited properties
collection = $.grep(collection, function (item) {
return item[property] === filter[property];
});
}
return collection.slice(0); // copy the array
// (in case of empty object filter)
default:
throw new TypeError('func must be either a' +
'function or an object of properties and values to filter by');
}
};
Array.prototype.firstOrDefault = function(func){
return this.where(func)[0] || null;
};
उपयोग:
var persons = [{ name: 'foo', age: 1 }, { name: 'bar', age: 2 }];
// returns an array with one element:
var result1 = persons.where({ age: 1, name: 'foo' });
// returns the first matching item in the array, or null if no match
var result2 = persons.firstOrDefault({ age: 1, name: 'foo' });
यहाँ एक है फंक्शन कन्स्ट्रक्टर बनाम ऑब्जेक्ट शाब्दिक गति की तुलना करने के लिए jsperf test। यदि आप पूर्व का उपयोग करने का निर्णय लेते हैं, तो तारों को सही ढंग से उद्धृत करने के लिए ध्यान रखें।
मेरी व्यक्तिगत वरीयता 1-2 गुणों को फ़िल्टर करते समय ऑब्जेक्ट शाब्दिक आधारित समाधानों का उपयोग करना है, और अधिक जटिल फ़िल्टरिंग के लिए कॉलबैक फ़ंक्शन पास करना है।
2 सामान्य युक्तियों के साथ इस समाप्त कर देंगे जब देशी वस्तु प्रोटोटाइप के लिए विधियां जोड़ने:
if(!Array.prototype.where) { Array.prototype.where = ...
आप हैं: अधिलेखित जैसे पहले मौजूदा तरीकों की घटना के लिए
चेक IE8 और नीचे का समर्थन करने की आवश्यकता नहीं है, उन्हें Object.defineProperty का उपयोग करके विधियों को परिभाषित करने के लिए विधियों को परिभाषित करें। अगर किसी ने किसी सरणी पर for..in
का उपयोग किया (जो पहले स्थान पर गलत है) वे भी समृद्ध गुणों को पुन: सक्रिय करेंगे। बिलकुल चौकन्ना।
@ChrisNevill मैंने – Johan
@MUlferts को अच्छी पकड़, अपडेट किया गया है, तो एक स्ट्रिंग संस्करण भी जोड़ा है। आजकल मैं इस तरह के कार्यों के लिए lodash का उपयोग करने का सुझाव दूंगा। वे – Johan
से ऊपर के कोड के समान इंटरफ़ेस का पर्दाफाश करते हैं, नॉकआउट अवलोकनों का समर्थन करने के लिए: 'वापसी प्रकार आइटम [संपत्ति] ===' फ़ंक्शन '? आइटम [संपत्ति]() === फ़िल्टर [संपत्ति]: आइटम [संपत्ति] === फ़िल्टर [संपत्ति]; ' –