6

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

作業を簡単にするために、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/

4

2 に答える 2

9

JS クロージャーをよく確認することをお勧めします。特に、そこで行ったことは、 Array.someメソッドを使用して 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

編集:この場合、実際にはクロージャーを使用していませんが、単純で単純な無名関数を使用しています...

于 2013-05-14T13:57:09.440 に答える