javascript - LINQ SingleOrDefault() equivalente
typescript typescript1.5 (2)
En Typescript, uso este patrón a menudo:
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 );
Estoy pensando en crear una extensión de JavaScript similar al método LINQ SingleOrDefault
donde devuelve null
si no está en la matriz:
var item = vegetable.singleOrDefault( xvegetable => {
return xvegetable.id == id});
Mi pregunta es si hay otra forma de lograr esto sin crear una interfaz personalizada.
Si desea buscar un elemento en una matriz, le sugiero que utilice el método de búsqueda de ES6 , de este modo:
const inventory = [
{ name: ''apples'', quantity: 2 },
{ name: ''bananas'', quantity: 0 },
{ name: ''cherries'', quantity: 5 }
];
const result = inventory.find(fruit => fruit.name === ''cherries'');
console.log(result) // { name: ''cherries'', quantity: 5 }
Es más rápido y fácil de leer, porque no es necesario escribir la collection[0]
.
Por cierto, SingleOrDefault
C # lanza una excepción si encuentra más de un elemento. Aquí estás intentando hacer una extensión de FirstOrDefault
.
Siempre puedes usar Array.prototype.filter de esta manera:
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
Editar
Mi respuesta se aplica a FirstOrDefault
y no a SingleOrDefault
.
SingleOrDefault
comprueba si solo hay una coincidencia y, en mi caso (y en su código), devuelve la primera coincidencia sin verificar otra coincidencia.
Por cierto, si quisieras alcanzar SingleOrDefault
entonces necesitarías cambiar esto:
var item = collection.length < 1 ? null : collection[0];
dentro
if(collection.length > 1)
throw "Not single result....";
return collection.length === 0 ? null : collection[0];