Wie andere erwähnt haben, diese „Array Comprehensions“ genannt wird, und es ist einer der vielen, schlug viele Funktionen für ECMAScript Harmony:
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
Doch wie bei so ziemlich jeder Harmony „Feature“ Ich glaube nicht, dass es eine echte Vorstellung darüber gibt, ob es tatsächlich in der endgültigen Version enthalten sein wird. Sie können es in Firefox als Teil von "JavaScript 1.7" verwenden (eine nebulöse "Standard" Spezifikation, die wirklich gilt nur für Mozilla-basierte Sachen); Es ist jedoch besser, die FF-spezifische Syntax zu vermeiden, insbesondere, wenn dies in anderen Browsern zu Syntaxfehlern führen würde.
Sie können mehr darüber lesen, indem Sie eine Google-Suche nach "Array Comprehensions" durchführen, aber wie bereits erwähnt, ist es aufgrund seiner Mozilla-spezifischen Natur kein sehr nützliches Tool.
Sie können einen ähnlichen Effekt ohne viel Code mit dem reduce()
Array-Methode eingeführt in ES5 erreichen:
//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;
}, []);
, die wenig sein könnte eine ausführliche im Vergleich zu dem, was Sie gesucht haben (auch wenn man bedenkt, dass wir musste eine range()
Funktion erstellen). Aber es ist eine relativ kompakte Lösung, die nicht viel "Setup" erfordert und sich hauptsächlich auf die Lösung des Problems konzentriert: das Filtern von Elementen von einem Array zu einem zweiten Array.
Ich konnte es auf einen Einzeiler reduzieren, aber es wird ein bisschen unweid zu pflegen, also entschied ich mich, stattdessen die zwei Linienversion vorzuschlagen.Wenn Sie sich für das One-Liner interessiert, hier ist es:
//Don't forget to define "range()"
var evens = range(0, 21).reduce(function (arr, cur) {
return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr;
}, []);
Auch dies ist ES5-Code. Wenn Sie möchten, dass es in älteren Browsern funktioniert, müssen Sie ein Shim verwenden, um Unterstützung für bereitzustellen. MDN hat man hier:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
UPDATE:
Sieht aus wie ich filter()
statt reduce()
verwendet haben sollte. Macht den Code viel sauberer. Danke an das OP für den Vorschlag!
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
Wieder filter()
ist ES5, so dass Sie ein Shim, um es wird richtig auf älteren Browsern funktionieren, um sicherzustellen, benötigen.
_ "Wie würde man diese Art von Syntax beschreiben?" _ - Der Artikel, den Sie verlinkt haben, nennt es "Array Comprehensions". – nnnnnn
Ich könnte falsch liegen, aber ich denke, dieser Begriff bezog sich auf die 'für jeden' innerhalb eines Array-Teils. Ich denke, ich habe diese andere 'If'-Syntax außerhalb von Arrays gesehen, aber ich bin mir nicht sicher. ? –
_Nicht nur das Array-Verständnis ist viel kompakter, aber es ist tatsächlich einfacher zu lesen, ** sobald Sie mit dem Konzept vertraut sind ** ._ Ich würde es nur wagen, sobald ich sicher bin, dass jeder die Syntax kennt. Der Betreuer ist ein gewalttätiger Psychopath und alle ... – Laoujin