2013-05-14 51 views
6

我想模拟C#Any()方法,该方法可用于确定集合是否具有基于lambda表达式的任何匹配对象。在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 2013-05-14 13:55:22

+0

@bfavaretto:我认为你的评论是一个很好的答案。 – nhahtdh 2013-05-14 13:57:28

+0

@nhahtdh我太慢了,现在的答案是没有意义的。 – bfavaretto 2013-05-14 14:04:20

回答

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 

编辑:特别是,你做了什么,也可以在本地通过JS使用Array.some方法来完成在这种情况下,我们并不是真的使用闭而是朴素简单的匿名函数...

+0

谢谢。他们应该叫它Any();-) – Johan 2013-05-14 14:01:41

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 2013-05-14 14:02:36