CoffeeScriptのドキュメントでは、リスト内包表記は選択/フィルター操作を実行できる必要があると述べています。
それらは、ループ、each/forEach、map、またはselect/filterを使用しない場合のほとんどの場所を処理できるはずです。
result = item for item in list if item % 2 == 0
のような1行で何かを実行できると想像するでしょう。
list = [1,2,3,4]
result = []
for item in list
if item % 2 == 0 then result.Push item
CoffeeScriptでリストをフィルタリングする最も簡潔な方法は何ですか?
result = (item for item in list when item % 2 == 0)
編集:result =
を追加
すべてのオンスのパフォーマンスを絞り出そうとしない限り、次のようなフィルター関数を作成します。
filter = (list, func) -> x for x in list when func(x)
または、すべての配列のプロトタイプに追加する場合:
Array::filter = (func) -> x for x in @ when func(x)
そして、書きます:(それぞれ)
result = filter mylist, (x) -> x % 2 == 0
または
result = mylist.filter (x) -> x % 2 == 0
参考までに、これは生成されるJavaScriptです。
var filter, result;
filter = function(list, func) {
var x, _i, _len, _results;
_results = [];
for (_i = 0, _len = list.length; _i < _len; _i++) {
x = list[_i];
if (func(x)) {
_results.Push(x);
}
}
return _results;
};
Array.prototype.filter = function(func) {
var x, _i, _len, _results;
_results = [];
for (_i = 0, _len = this.length; _i < _len; _i++) {
x = this[_i];
if (func(x)) {
_results.Push(x);
}
}
return _results;
};
result = filter(mylist, function(x) {
return x % 2 === 0;
});
result = mylist.filter(function(x) {
return x % 2 === 0;
});
同様の質問があります ここ