6

我想模拟 C# Any()方法,该方法可用于根据 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/

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 回答
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
于 2013-05-14T13:58:02.877 回答