2013-05-14 11 views
6

Chciałbym zasymulować metodę C# Any(), która może być użyta do określenia, czy kolekcja ma jakiekolwiek pasujące obiekty oparte na wyrażeniu lambda.Symulowanie metod C# Lambda w JavaScript

użyłem jQuery $.grep aby ułatwić:

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 

wiem, że eval() jest złą praktyką z oczywistych powodów. Ale czy w tym przypadku jest w porządku, skoro nie użyję tego do niczego związanego z danymi wejściowymi użytkownika?

Czy można to zrobić bez eval()? Nie mogę znaleźć sposobu na przekazanie wyrażenia do funkcji bez jego oceny.

http://jsfiddle.net/dgGvN/

+7

Nie możesz przekazać funkcji zamiast ciągu wyrażenia? To byłoby bardziej przyjazne dla Js. – bfavaretto

+0

@bfavaretto: Myślę, że twój komentarz stanowi dobrą odpowiedź. – nhahtdh

+0

@nhahtdh Byłem zbyt wolny, teraz byłoby to bezcelowe, biorąc pod uwagę obecne odpowiedzi. – bfavaretto

Odpowiedz

9

Proponuję wziąć przyjrzeć zamknięć JS. W szczególności, co tam robił można zrobić natywnie w JS przy użyciu metody 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 

EDIT: w tym przypadku nie jesteśmy naprawdę przy użyciu zamknięć ale raczej zwykły prostych funkcji anonimowych ...

+0

Dzięki. Powinni go nazwać Any() ;-) – Johan

5

Przekaż funkcję:

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

Dzięki. W ten sposób będzie działać tak jak metoda some(), o której wspomniał @CAFxX (o której oczywiście nie wiedziałem) – Johan