10

Firefoxがの行に沿ってある種のJavaScript構文をサポートしていることを示すいくつかの例を見てきました*something* if *expression*;

私が話していることの例として、次の例を含むこのMDNの記事を参照してください。

var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)];

私の質問は次のとおりです。

この種の構文を説明するためにどのような名前が付けられますか?私は主にこれを知りたいので、グーグルでそれについてもっと読むことができます。私はグーグルを思いつく限り最善を尽くしてみましたが、役立つ結果を得るために適切な用語をまとめることができませんでした。

この構文は、配列理解以外の他の場所に存在できますか?これがアレイの外部で使用されている他の例(上記の例など)を見たように感じますが、よくわかりません。

この構文の詳細はどこで読むことができますか?

Firefox以外にこれをサポートしているブラウザはありますか?

この機能はES5に含まれていますか、それともES-harmonyで計画されていますか?

4

2 に答える 2

4

他の人が指摘しているように、これは「配列内包表記」と呼ばれ、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であるため、古いブラウザで正しく機能するようにするには、シムが必要です。

于 2012-09-24T00:05:48.297 に答える
2

このタイプのステートメントは、リスト内包と呼ばれます。Pythonには、非常によく似た構文の良い例があります。

于 2012-09-23T23:35:29.143 に答える