1. ホーム
  2. javascript

[解決済み] 条件に合致する、配列内のオブジェクトのインデックスを取得します。

2022-03-22 23:33:40

質問

このような配列があります。

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

配列全体を反復処理することなく、条件に一致するオブジェクトのインデックスを取得するにはどうすればよいですか?

例えば prop2=="yutu" インデックスを取得したい 1 .

私は見た .indexOf() のような単純な配列に使用されると思います。 ["a1","a2",...] . また $.grep() が、これはオブジェクトを返すのであって、インデックスを返すわけではありません。

解決方法は?

2016年現在、あなたが使うのは Array.findIndex (ES2015/ES6標準規格)を使用しています。

a = [
  {prop1:"abc",prop2:"qwe"},
  {prop1:"bnmb",prop2:"yutu"},
  {prop1:"zxvz",prop2:"qwrq"}];
    
index = a.findIndex(x => x.prop2 ==="yutu");

console.log(index);

Google Chrome、Firefox、Edgeでサポートされています。Internet Explorerについては、リンク先のページでポリフィルが公開されています。

パフォーマンスに関する注意事項

関数呼び出しは高価なので、非常に大きな配列の場合は、単純なループを使用した方が findIndex :

let test = [];

for (let i = 0; i < 1e6; i++)
    test.push({prop: i});


let search = test.length - 1;
let count = 100;

console.time('findIndex/predefined function');
    let fn = obj => obj.prop === search;

    for (let i = 0; i < count; i++)
        test.findIndex(fn);
console.timeEnd('findIndex/predefined function');


console.time('findIndex/dynamic function');
    for (let i = 0; i < count; i++)
        test.findIndex(obj => obj.prop === search);
console.timeEnd('findIndex/dynamic function');


console.time('loop');
    for (let i = 0; i < count; i++) {
        for (let index = 0; index < test.length; index++) {
            if (test[index].prop === search) {
                break;
            }
        }
    }
console.timeEnd('loop');

ほとんどの最適化と同様に、これは慎重に、実際に必要なときだけ適用する必要があります。