2015-10-11 11 views
16

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

私はそれが配列ではない場合、それはnullを返しますLINQ SingleOrDefault方法と同様の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 

編集
私の答えはSingleOrDefaultFirstOrDefaultに適用されません。
SingleOrDefaultは、一致するものが1つだけあるかどうかをチェックし、私の場合(そしてあなたのコードでは)最初の一致を返します。

あなたがSingleOrDefaultを達成したい場合はところで、あなたは、この変更する必要があります:あなたは配列内のアイテムを検索したい場合は、私が使用することをお勧め

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

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

コレクションが常に単一の結果をもたらすことがわかっている場合は、追加の[0]表記を使用します。そして、コレクションが複数ある場合、SingleOrDefaultの動作はエラーをスローします。 Typescriptは私たちのゲームチェンジャーであり、私はC#のような機能を探しています。お返事をありがとうございます。 – hlo

11

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

ES6 find method

コレクション[0]のように書く必要がないため、読み込みが高速で簡単です。 BTW C#SingleOrDefaultは、複数の要素が見つかった場合に例外をスローします。ここでFirstOrDefault拡張機能を作成しようとしています。