はい、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/
更新:
これは非常に人気のある回答になっているため、同様のmy 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テストを次に示します。前者を使用する場合は、文字列を正しく引用することを覚えておいてください。
私の個人的な好みは、1-2個のプロパティをフィルタリングするときにオブジェクトリテラルベースのソリューションを使用し、より複雑なフィルタリングのためにコールバック関数を渡すことです。
これを、ネイティブオブジェクトプロトタイプにメソッドを追加するときの2つの一般的なヒントで終わります。
上書きする前に、既存のメソッドの出現を確認してください。例:
if(!Array.prototype.where) {
Array.prototype.where = ...
IE8以下をサポートする必要がない場合は、Object.definePropertyを使用してメソッドを定義し、列挙できないようにします。誰かがfor..in
配列を使用した場合(そもそも間違っています)、列挙可能なプロパティも繰り返し処理します。頭を上げただけです。