他の人が指摘しているように、これは「配列内包表記」と呼ばれ、ECMAScriptHarmonyに提案されている多くの機能の1つです。
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
ただし、ほとんどすべてのHarmonyの「機能」と同様に、それが実際に最終リリースに含まれるかどうかについては、実際の概念はないと思います。Firefoxで「JavaScript1.7」の一部として使用できます(あいまいです"標準"その仕様本当Mozillaベースのものにのみ適用されます); ただし、特に他のブラウザで構文エラーが発生する場合は、FF固有の構文を避けることをお勧めします。
Googleで「配列の理解」を検索すると詳細を読むことができますが、前述したように、Mozilla固有の性質があるため、あまり便利なツールではありません。
reduce()
ES5で導入されたArrayメソッドを使用すると、コードを増やすことなく同様の効果を得ることができます。
//JavaScript has no "range" function, so let's make one
var range = function (begin, length) {
var i, ret = [];
for (i = begin; i < begin + length; i++) {
ret.push(i);
}
return ret;
};
var evens = range(0, 21).reduce(function (arr, cur) {
if (cur % 2 === 0) arr.push(cur);
return arr;
}, []);
それはあなたが探していたものと比較して少し冗長かもしれません(range()
関数を作成しなければならなかったことを覚えていても)。しかし、これは比較的コンパクトなソリューションであり、多くの「セットアップ」を必要とせず、主に問題の解決に固執します。つまり、1つの配列から要素をフィルタリングして2番目の配列を形成します。
ワンライナーに減らすことはできましたが、メンテナンスが少し面倒になるので、代わりに2ラインバージョンを提案することにしました。ワンライナーに興味がある場合は、次のとおりです。
//Don't forget to define "range()"
var evens = range(0, 21).reduce(function (arr, cur) {
return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr;
}, []);
繰り返しますが、これはES5コードです。古いブラウザで動作させたい場合は、のサポートを提供するためにシムを考え出す必要がありますArray.reduce()
。MDNにはここに1つあります:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
アップデート:
filter()
の代わりに使用する必要があったようですreduce()
。コードをよりクリーンにします。それを提案してくれたOPに感謝します!
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
繰り返しにfilter()
なりますが、ES5であるため、古いブラウザで正しく機能するようにするには、シムが必要です。