【问题标题】:Simulate C# Lambda methods in Javascript在 Javascript 中模拟 C# Lambda 方法
【发布时间】:2013-05-14 13:53:13
【问题描述】:

我想模拟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/

【问题讨论】:

  • 你不能传递一个函数而不是一个表达式字符串吗?这样对 js 更友好。
  • @bfavaretto:我认为你的评论是一个很好的答案。
  • @nhahtdh 我太慢了,现在考虑到当前的答案,这将毫无意义。

标签: javascript jquery


【解决方案1】:

我建议你好好看看 JS 闭包。特别是,您在 JS 中所做的事情可以使用 Array.some 方法在本机中完成:

[{ 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

编辑:在这种情况下,我们并没有真正使用闭包,而是使用简单的匿名函数......

【讨论】:

  • 谢谢。他们应该叫它 Any() ;-)
【解决方案2】:

传入一个函数:

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

【讨论】:

  • 谢谢。这样它就可以像@CAFxX 提到的 some() 方法一样工作(我显然不知道)
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2011-12-19
  • 2023-02-20
相关资源
最近更新 更多