2015-10-11 17 views
16

In Typescript utilizzo spesso questo motivo.LINQ SingleOrDefault in Typescript

class Vegetable { 
    constructor(public id: number, public name: string) { 
    } 
} 

var vegetable_array = new Array<Vegetable>(); 
vegetable_array.push(new Vegetable(1, "Carrot")); 
vegetable_array.push(new Vegetable(2, "Bean")); 
vegetable_array.push(new Vegetable(3, "Peas")); 

var id = 1; 
var collection = vegetable_array.filter(xvegetable => { 
    return xvegetable.id == id; 
}); 
var item = collection.length < 1 ? null : collection[0]; 

console.info(item.name); 

Sto pensando di creare un estensione JavaScript simile al metodo LINQ SingleOrDefault dove restituisce null se non è nella matrice.

var item = vegetable.singleOrDefault(xvegetable => { 
    return xvegetable.id == id}); 

La mia domanda è se esiste un altro modo per ottenere ciò senza creare un'interfaccia personalizzata. TIA.

+0

Ci sono alcuni slancio in questa direzione. Vedi https://linqjs.codeplex.com/ e http://lord-saumagen.github.io/TS – hlo

risposta

19

È sempre possibile utilizzare Array.prototype.filter in questo modo:

var arr = [1,2,3]; 
var notFoundItem = arr.filter(id => id === 4)[0]; // will return undefined 
var foundItem = arr.filter(id => id === 3)[0]; // will return 3 

Modifica
La mia risposta vale per FirstOrDefault e non a SingleOrDefault.
SingleOrDefault controlla se c'è una sola corrispondenza e nel mio caso (e nel codice) si restituisce la prima partita senza verificare un'altra corrispondenza.

A proposito, se si voleva raggiungere SingleOrDefault allora si avrebbe bisogno di cambiare questo:

var item = collection.length < 1 ? null : collection[0]; 

in

if(collection.length > 1) 
    throw "Not single result...."; 

return collection.length === 0 ? null : collection[0]; 
+0

Io uso la notazione aggiuntiva [0] se so che la raccolta produrrebbe sempre un singolo risultato. E sì, il comportamento per SingleOrDefault genererebbe un errore se la collezione ne genera più di uno. Il dattiloscritto è stato un punto di svolta per noi e non vedo l'ora che funzioni come C#. Grazie per la risposta. – hlo

11

Se si vuole trovare un elemento in array, suggerisco di usare ES6 find method

È più veloce e più facile da leggere, perché non è necessario scrivere come collezione [0]. BTW C# SingleOrDefault genera un'eccezione se trova più di un elemento. Qui stai cercando di creare l'estensione FirstOrDefault.