次のような配列があります:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
配列全体を反復処理せずに、条件に一致するオブジェクトのインデックスを取得するにはどうすればよいですか?
たとえば、 が与えられた場合prop2=="yutu"
、インデックス を取得したいとします1
。
見ました.indexOf()
が、 のような単純な配列に使用されると思います["a1","a2",...]
。 また、確認しました$.grep()
が、これはインデックスではなくオブジェクトを返します。
ベストアンサー1
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');
ほとんどの最適化と同様に、これは注意して適用し、実際に必要な場合にのみ適用する必要があります。