2013-05-14 11 views
6

私はC#Any()メソッドをシミュレートしたいと思います。これは、コレクションにラムダ式に基づいて一致するオブジェクトがあるかどうかを判断するのに使用できます。JavascriptでC#Lambdaメソッドをシミュレートする

私は物事を簡単にするためにjQueryの$.grepを使用:

Array.prototype.any = function (expr) { 

    if (typeof jQuery === 'undefined') 
     throw new ReferenceError('jQuery not loaded'); 

    return $.grep(this, function (x, i) { 
     return eval(expr); 
    }).length > 0; 

}; 

var foo = [{ a: 1, b: 2 }, { a:1, b: 3 }]; 

console.log(foo.any('x.a === 1')); //true 
console.log(foo.any('x.a === 2')); //false 

私はeval()は明白な理由のために悪い習慣であることを知っています。しかし、私はいくつかのユーザーの入力に関連するものでこれを使用しないので、この場合は大丈夫ですか?

eval()なしでこれを行うことはできますか?関数を評価せずに関数に式を渡す方法はわかりません。

http://jsfiddle.net/dgGvN/

+7

式の代わりに関数を渡すことはできませんか?それはより親しみやすくなります。 – bfavaretto

+0

@bfavaretto:あなたのコメントは良い答えだと思います。 – nhahtdh

+0

@nhahtdh私は遅すぎましたが、現在の答えを考えると無意味です。おかげさまで – bfavaretto

答えて

9

私はあなたがJSの閉鎖をよく見てとる示唆しています。

[{ a: 1, b: 2 }, { a:1, b: 3 }].some(function(x) { return x.a === 1; }); // true 
[{ a: 1, b: 2 }, { a:1, b: 3 }].some(function(x) { return x.a === 2; }); // false 

編集:特に、あなたがそこに何をしたかArray.some方法使用してJSでネイティブに行うことができます...この場合、私たちは本当に閉鎖ではなく、プレーンなシンプルな無名関数を使用していないが

+0

彼らはそれをAny();-)と呼ぶべきでした。 – Johan

5

関数を渡す:

Array.prototype.any = function (expr) { 

    if (typeof jQuery === 'undefined') 
     throw new ReferenceError('jQuery not loaded'); 

    return $.grep(this, expr).length > 0; 

}; 

var foo = [{ a: 1, b: 2 }, { a:1, b: 3 }]; 

console.log(foo.any(function(x, i){return x.a === 1})); //true 
console.log(foo.any(function(x, i){return x.a === 2})); //false 
+0

ありがとうございました。こうすることで、@ CAFxXが述べたsome()メソッドのように動作します(これは明らかに分かりませんでした) – Johan