最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

jquery - Simulate C# Lambda methods in Javascript - Stack Overflow

matteradmin8PV0评论

I would like to simulate the C# Any() method, which can be used to determine whether if a collection has any matching objects based on a lambda expression.

I used jQuery's $.grep to make things easier:

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

I know that eval() is bad practice for obvious reasons. But is it ok in this case, since I won't use this with anything related to some user inputs?

Can this be done without eval()? I can't figure out a way to pass an expression to the function without evaluating it.

/

I would like to simulate the C# Any() method, which can be used to determine whether if a collection has any matching objects based on a lambda expression.

I used jQuery's $.grep to make things easier:

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

I know that eval() is bad practice for obvious reasons. But is it ok in this case, since I won't use this with anything related to some user inputs?

Can this be done without eval()? I can't figure out a way to pass an expression to the function without evaluating it.

http://jsfiddle/dgGvN/

Share Improve this question asked May 14, 2013 at 13:53 JohanJohan 35.3k62 gold badges189 silver badges306 bronze badges 3
  • 7 Can't you pass a function instead of an expression string? That would be more js-friendly. – bfavaretto Commented May 14, 2013 at 13:55
  • @bfavaretto: I think your ment makes a good answer. – nhahtdh Commented May 14, 2013 at 13:57
  • @nhahtdh I was too slow, now it would be pointless given the current answers. – bfavaretto Commented May 14, 2013 at 14:04
Add a ment  | 

2 Answers 2

Reset to default 9

I suggest you take a good look at JS closures. In particular, what you did there can be done natively in JS by using the Array.some method:

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

edit: in this case we're not really using closures but rather plain simple anonymous functions...

Pass in a function:

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
Post a comment

comment list (0)

  1. No comments so far