2013-05-14 11 views
6

Vorrei simulare il metodo C# Any(), che può essere utilizzato per determinare se una raccolta ha oggetti corrispondenti basati su un'espressione lambda.Simula metodi C# Lambda in Javascript

Ho usato jQuery di $.grep per rendere le cose più facili:

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 

So che eval() è cattiva pratica per ovvie ragioni. Ma va bene in questo caso, dal momento che non lo userò con qualcosa relativo ad alcuni input dell'utente?

Questo può essere fatto senza eval()? Non riesco a capire un modo per passare un'espressione alla funzione senza valutarla.

http://jsfiddle.net/dgGvN/

+7

Non è possibile passare una funzione anziché una stringa di espressione? Sarebbe più amichevole. – bfavaretto

+0

@bfavaretto: Penso che il tuo commento sia una buona risposta. – nhahtdh

+0

@nhahtdh Ero troppo lento, ora sarebbe inutile date le risposte attuali. – bfavaretto

risposta

9

vi consiglio di dare una buona occhiata a chiusure JS. In particolare, quello che hai fatto non può essere fatto in modo nativo in JS utilizzando il metodo 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: in questo caso non stiamo molto usare le chiusure, ma piuttosto semplice semplici funzioni anonime ...

+0

Grazie. Avrebbero dovuto chiamarlo Qualsiasi() ;-) – Johan

5

Passaggio in una funzione:

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

Grazie. In questo modo funzionerà proprio come il metodo some() che @CAFxX ha menzionato (di cui ovviamente non ero a conoscenza) – Johan