Ya, Array.map () atau $ .map () melakukan hal yang sama.
//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/
Karena array.map tidak didukung di browser lama, saya sarankan Anda tetap menggunakan metode jQuery.
Jika Anda lebih suka yang lain karena alasan tertentu Anda selalu bisa menambahkan polyfill untuk dukungan browser lama.
Anda selalu dapat menambahkan metode khusus ke prototipe array:
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;
});
Versi diperpanjang yang menggunakan konstruktor fungsi jika Anda melewatkan string. Sesuatu untuk dimainkan mungkin:
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/
Memperbarui:
Karena ini telah menjadi jawaban yang begitu populer, saya menambahkan where()
+ saya yang serupa firstOrDefault()
. Ini juga dapat digunakan dengan pendekatan konstruktor fungsi berbasis string (yang tercepat), tetapi di sini ada pendekatan lain menggunakan objek literal sebagai filter:
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;
};
Pemakaian:
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' });
Berikut adalah tes jsperf untuk membandingkan fungsi constructor vs kecepatan literal objek. Jika Anda memutuskan untuk menggunakan yang pertama, ingatlah untuk mengutip string dengan benar.
Preferensi pribadi saya adalah menggunakan solusi berbasis objek objek saat memfilter properti 1-2, dan meneruskan fungsi panggilan balik untuk pemfilteran yang lebih kompleks.
Saya akan mengakhiri ini dengan 2 tips umum ketika menambahkan metode ke prototipe objek asli:
Periksa kemunculan metode yang ada sebelum menimpa misalnya:
if(!Array.prototype.where) {
Array.prototype.where = ...
Jika Anda tidak perlu mendukung IE8 dan di bawah ini, tentukan metode menggunakan Object.defineProperty untuk membuatnya tidak dapat dihitung. Jika seseorang menggunakan for..in
array (yang salah di tempat pertama) mereka akan mengulangi properti enumerable juga. Hanya kepala.