web-dev-qa-db-ja.com

TypeScript-属性値に基づいて配列からオブジェクトを取り出す

私の配列は次のようになります。

array = [object {id: 1, value: "itemname"}, object {id: 2, value: "itemname"}, ...]

すべてのオブジェクトは同じ属性を持ちますが、値は異なります。

その配列にWHEREステートメントを使用する簡単な方法はありますか?

Object.id = varのオブジェクトを取得します

または、配列全体をループしてすべての項目をチェックする必要がありますか?私の配列には100以上のエントリがあるので、より効率的な方法があるかどうか知りたい

32
Nicolas

Array.findを使用:

let array = [
    { id: 1, value: "itemname" },
    { id: 2, value: "itemname" }
];

let item1 = array.find(i => i.id === 1);

MDNでのArray.find: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find

72
Saravana

filter または reduce を使用します:

let array = [
    { id: 1, value: "itemname" },
    { id: 2, value: "itemname" }
];

let item1 = array.filter(item => item.id === 1)[0];
let item2 = array.reduce((prev, current) => prev || current.id === 1 ? current : null);

console.log(item1); // Object {id: 1, value: "itemname"}
console.log(item2); // Object {id: 1, value: "itemname"}

遊び場のコード

配列全体を繰り返し処理する場合は、 some を使用します。

let item;
array.some(i => {
    if (i.id === 1) {
        item = i;
        return true;
    }
    return false;
});

遊び場のコード

5
Nitzan Tomer

列を指定せずにオブジェクトのすべてのフィールドから値を検索する必要がある場合、TypeScriptを使用してオブジェクトの配列内の特定の値を動的に検索できます

 var searchText = 'first';

let items = [
            { id: 1, name: "first", grade: "A" },
            { id: 2, name: "second", grade: "B" }
        ];

This below code will search for the value

var result = items.filter(item => 
             Object.keys(item).some(k => item[k] != null && 
             item[k].toString().toLowerCase()
             .includes(searchText.toLowerCase()))
             );

TypeScriptを使用して、angularjs 4で検索フィルターパイプを作成するために同じアプローチを使用できます。

2
Aamir

配列をループする必要がありますが、各idをインデックスにリンクするハッシュマップを作成して保存する場合、一度だけ実行すればよいので、その後のオブジェクトを直接参照できます。

var idReference = myArray.reduce(function( map, record, index ) {
    map[ record.id ] = index;
    return map;
}, {});

var objectWithId5 = myArray[ idReference["5"] ];

ただし、これはすべてのIDが一意であることを前提としています。

2
Shilly