2015-10-11 2 views
16

В Typcript я часто использую этот шаблон.LINQ SingleOrDefault в машинописном тексте

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); 

Я думаю о создании расширения JavaScript аналогично методу LINQ SingleOrDefault, где он возвращает нулевое значение, если это не в массиве.

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

Вопрос в том, есть ли другой способ достичь этого без создания пользовательского интерфейса. ТИА.

+0

Есть определенный импульс в этом направлении. См. Https://linqjs.codeplex.com/ и http://lord-saumagen.github.io/TS – hlo

ответ

19

Вы всегда можете использовать Array.prototype.filter таким образом:

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 

Редактировать
Мой ответ относится к FirstOrDefault и не SingleOrDefault.
SingleOrDefault проверяет, существует ли только одно совпадение, и в моем случае (и в вашем коде) вы возвращаете первое совпадение, не проверяя наличие другого совпадения.

КСТАТИ Если вы хотите, чтобы достичь SingleOrDefault тогда вам нужно будет изменить:

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

в

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

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

Я использую дополнительную нотацию [0], если я знаю, что коллекция всегда даст единственный результат. И да, поведение SingleOrDefault вызовет ошибку, если коллекция дает более одного. Typcript был для меня сменой игры, и я с нетерпением жду большего, чем C#, чтобы найти его там. Спасибо за ваш ответ. – hlo

11

Если вы хотите, чтобы найти один элемент в массиве, я предлагаю использовать ES6 find method

Это быстрее и легче читать, потому что вам не нужно писать, как коллекция [0]. BTW C# SingleOrDefault выдает исключение, если найдено более одного элемента. Здесь вы пытаетесь сделать расширение FirstOrDefault.