2015-10-11 78 views
16

In Typescript我經常使用這種模式。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); 

我正在考慮建立類似LINQ的SingleOrDefault方法,其中,如果它不是數組中返回null一個JavaScript擴展。

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

我的問題是是否有另一種方式來實現這一點,而無需創建自定義界面。 TIA。

+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的行爲會引發錯誤。 Typescript一直是我們的遊戲改變者,我期待着更多類似於C#的功能來找到它。感謝您的答覆。 – hlo

11

如果你想找到陣列的一個項目,我建議使用ES6 find method

讀取速度更快,更容易閱讀,因爲您不需要像集合[0]那樣編寫。順便說一句,如果C#SingleOrDefault發現多個元素,則拋出異常。在這裏你試圖做FirstOrDefault擴展。