Evet, Array.map () veya $ .map () aynı şeyi yapar.
//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 eski tarayıcılarda desteklenmediğinden, jQuery yöntemine bağlı kalmanızı öneririm.
Diğerini bir nedenle tercih ederseniz, eski tarayıcı desteği için her zaman bir çoklu dolgu ekleyebilirsiniz.
Dizi prototipine her zaman özel yöntemler de ekleyebilirsiniz:
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;
});
Bir dize iletirseniz işlev yapıcısını kullanan genişletilmiş bir sürüm. Belki de oynayabileceğiniz bir şey:
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/
Güncelleme:
Bu çok popüler bir cevap haline geldiğinden, where()
+ 'ya benzer bir şey ekliyorum firstOrDefault()
. Bunlar aynı zamanda (en hızlı olan) dize tabanlı işlev yapıcı yaklaşımı ile de kullanılabilir, ancak burada bir nesne değişmezini filtre olarak kullanan başka bir yaklaşım vardır:
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;
};
Kullanımı:
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' });
Fonksiyon yapıcısı ile nesne değişmez hızını karşılaştırmak için bir jsperf testi . Birincisini kullanmaya karar verirseniz, dizeleri doğru şekilde alıntılamayı unutmayın.
Kişisel tercihim 1-2 özelliğe filtre uygularken nesne tabanlı çözümleri kullanmak ve daha karmaşık filtreleme için geri arama işlevini iletmektir.
Yerel nesne prototiplerine yöntem eklerken bunu 2 genel ipucu ile bitireceğim:
Üzerine yazmadan önce mevcut yöntemlerin olup olmadığını kontrol edin örn.
if(!Array.prototype.where) {
Array.prototype.where = ...
IE8 ve aşağısını desteklemeniz gerekmiyorsa , numaralandırılamaz hale getirmek için Object.defineProperty'yi kullanarak yöntemleri tanımlayın . Birisi for..in
bir dizi (ilk etapta yanlış) kullanılırsa onlar da numaralandırılabilir özellikleri yineleyecektir. Sadece aklınızda bulunsun.