が指摘している、これは「配列内包」と呼ばれ、それが多くの一つだ、多くの機能は、ECMAScriptのハーモニーのための提案:
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
しかし、ほとんどすべてのハーモニー「機能」を持つよう私は最終的なリリースに実際に含まれるかどうかという本当の考えはないと思います。 「JavaScript 1.7」(「標準」仕様のは実際にはがMozillaベースのものにのみ適用されます)の一部としてFirefoxで使用できます。ただし、特に別のブラウザで構文エラーが発生する場合は、FF固有の構文を避ける方がよいでしょう。
「Array Comprehensions」のGoogle検索で詳しく読むことができますが、前述したように、Mozilla固有の性質のため、非常に便利なツールではありません。
あなたはES5で導入reduce()
アレイ法使用してより多くのコードなしで同様の効果を得ることができます。我々は(さえ念頭に置いて
//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()
関数を作成しなければなりませんでした)。しかし、これは比較的コンパクトなソリューションであり、多くの「セットアップ」を必要とせず、主に問題の解決に固執しています。つまり、あるアレイの要素をフィルタリングして2番目のアレイを形成します。
私はそれを1ライナーに減らすことができましたが、維持するのが少し不安になるので、代わりに2行バージョンを提案することにしました。1つのライナーに興味がある場合は、
//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は、ここに一つを有する:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
UPDATE:
私はfilter()
代わりのreduce()
を使用している必要がありますように見えます。コードをもっときれいにします。それを提案するOPのおかげで!
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
ここでも、filter()
はES5であるので、あなたはそれが古いブラウザで正しく機能することを確認するために、シムが必要になります。
_この種の構文を説明するのにどのような名前が付けられますか?_ - あなたがリンクした記事は「配列の理解」と呼ばれています。 – nnnnnn
私は間違っているかもしれませんが、私はその言葉が配列部分の中の 'for each 'を指していたと思います。私は、配列の外側で使用されるこの異なる 'if'構文を見てきましたが、わかりません。 ? –
_配列の理解度ははるかにコンパクトではありませんが、実際に読むのが簡単です** **概念に精通していれば**。私は誰もが構文を知っていると確信しています。メンテナーは暴力的な精神病者であり、すべて... – Laoujin