156

私はこれを行うための効率的な方法を見つけるために少しサーフィンをしてきましたが、どこにも行きませんでした。次のようなオブジェクトの配列があります。

array[i].id = some number;
array[i].name = some name;

私がやりたいのは、idがたとえば0、1、2、3、または4のいずれかに等しいオブジェクトのINDEXESを見つけることです。次のようなことができると思います。

var indexes = [];
for(i=0; i<array.length; i++) {
  (array[i].id === 0) ? { indexes[0] = i }
  (array[i].id === 1) ? { indexes[1] = i }
  (array[i].id === 2) ? { indexes[2] = i }
  (array[i].id === 3) ? { indexes[3] = i }
  (array[i].id === 4) ? { indexes[4] = i }
}

これは機能しますが、特にarray.lengthが大きくなる可能性がある場合は、非常に高価で低速に見えます(醜いことは言うまでもありません)。これを少し整える方法について何かアイデアはありますか?どういうわけかarray.indexOfを使用することを考えましたが、構文を強制する方法がわかりません。これ

array.indexOf(this.id === 0);

たとえば、おそらく必要なように、undefinedを返します。

4

19 に答える 19

419

「マップ」などの高階関数を使用したい場合があります。'field'属性で検索したい場合:

var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
var objectFound = array[elementPos];
于 2013-04-19T08:28:51.800 に答える
90

配列内の要素インデックスを見つける最も簡単で簡単な方法。

ES5構文: [{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})

ES6構文: [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)

于 2016-12-21T10:21:58.717 に答える
26

新しい配列メソッド.filter()は、これに適しています。

var filteredArray = array.filter(function (element) { 
    return element.id === 0;
});

jQueryは.grep()を使用してこれを行うこともできます

編集:これらの機能は両方とも内部で繰り返されるだけであり、それらと独自のフィルター機能のローリングとの間に顕著なパフォーマンスの違いはありませんが、なぜ車輪を再発明するのかについて言及する価値があります。

于 2012-05-11T19:37:18.183 に答える
17

パフォーマンスが気になる場合は、検索フィルターマップ、または上記の方法のいずれかを使用しないでください。

これは、最速の方法を示す例です。ここに実際のテストへのリンクがあります

セットアップブロック

var items = []

for(var i = 0; i < 1000; i++) {
    items.push({id: i + 1})
}

var find = 523

最速の方法

var index = -1
for(var i = 0; i < items.length; i++) {
    if(items[i].id === find) {
        index = i;
        break;
    }
}

遅い方法

items.findIndex(item => item.id === find)

最も遅い方法

items.map(item => item.id).indexOf(find);
于 2019-03-16T16:31:51.760 に答える
7
array.forEach(function (elem, i) {  // iterate over all elements of array
    indexes[elem.id] = i;           // take the found id as index for the
});                                 // indexes array and assign i

結果は、IDのルックアップリストです。指定されたIDを使用して、レコードのインデックスを取得します。

于 2015-04-08T17:05:06.323 に答える
7

通常の配列を使用した答えはないのでfind

var one = {id: 1, name: 'one'};
var two = {id: 2, name:'two'}
var arr = [one, two] 

var found = arr.find((a) => a.id === 2)

found === two // true

arr.indexOf(found) // 1
于 2017-06-08T20:44:35.820 に答える
6
var indices = [];
var IDs = [0, 1, 2, 3, 4];

for(var i = 0, len = array.length; i < len; i++) {
    for(var j = 0; j < IDs.length; j++) {
        if(array[i].id == ID) indices.push(i);
    }
}
于 2012-05-11T19:34:00.660 に答える
6

const index = array.findIndex(item => item.id === 'your-id');

これにより、id===your-idの配列内のアイテムのインデックスが取得されます。

array = [ {id:1}, {id:2} ];

const index = array.findIndex(item => item.id === 2);

console.log(index);

于 2018-07-19T06:58:57.757 に答える
4

ES6を使用した新しい方法

let picked_element = array.filter(element => element.id === 0);
于 2018-01-24T22:40:09.880 に答える
3

ES6map機能の使用:

let idToFind = 3;
let index = someArray.map(obj => obj.id).indexOf(idToFind);
于 2017-06-08T20:22:39.627 に答える
2

テスト用のコールバックを使用して単純なイテレータを作成できるように思えます。そのようです:

function findElements(array, predicate)
{
    var matchingIndices = [];

    for(var j = 0; j < array.length; j++)
    {
        if(predicate(array[j]))
           matchingIndices.push(j);
    }

    return matchingIndices;
}

次に、次のように呼び出すことができます。

var someArray = [
     { id: 1, text: "Hello" },
     { id: 2, text: "World" },
     { id: 3, text: "Sup" },
     { id: 4, text: "Dawg" }
  ];

var matchingIndices = findElements(someArray, function(item)
   {
        return item.id % 2 == 0;
   });

// Should have an array of [1, 3] as the indexes that matched
于 2012-05-11T19:35:06.160 に答える
2

Tejsの答えをmongoDBとRobomongoに適合させる私は変更しました

matchingIndices.push(j);

matchingIndices.push(NumberInt(j+1));
于 2015-07-19T18:23:56.087 に答える
2

上記のすばらしい答えのすべてと、すべてのインデックスの検索に関する私の答えの追加を要約すると、コメントの一部から発生しました。

  1. 最初に出現したインデックスを返します。

const array = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 2 }];
const idYourAreLookingFor = 2;

//ES5 
//Output: 1
array.map(function (x) { return x.id; }).indexOf(idYourAreLookingFor);

//ES6 
//Output: 1
array.findIndex(obj => obj.id === idYourAreLookingFor);

  1. reduceを使用して、すべてのオカレンスのインデックス配列を返します。

const array = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 2 }]
const idYourAreLookingFor = 2;

//ES5
//Output: [1, 4]
array.reduce(function (acc, obj, i) {
  if (obj.id === idYourAreLookingFor)
    acc.push(i);
  return acc;
}, []);

//ES6
//Output: [1, 4]
array.reduce((acc, obj, i) => (obj.id === idYourAreLookingFor) ? acc.concat(i) : acc, [])

于 2017-08-15T09:27:34.907 に答える
1

スーパーアレイと呼ばれる小さなユーティリティを作成しました。このユーティリティでは、O(1)の複雑さを持つ一意の識別子によって配列内のアイテムにアクセスできます。例:

const SuperArray = require('super-array');

const myArray = new SuperArray([
  {id: 'ab1', name: 'John'},
  {id: 'ab2', name: 'Peter'},
]);

console.log(myArray.get('ab1')); // {id: 'ab1', name: 'John'}
console.log(myArray.get('ab2')); // {id: 'ab2', name: 'Peter'}
于 2017-09-24T17:46:08.953 に答える
1

@PirateBayが指摘しているように、古い方法が最適な場合もあります。

ES 6/7では、「。find」も非常に高速で、一致すると停止します(.mapや.filterとは異なります)

items.find(e => e.id === find)?.id
于 2021-08-04T04:35:55.437 に答える
0

まだコメントできないので、Umair Ahmedが投稿した方法に基づいて使用したソリューションを示したいと思いますが、値の代わりにキーを検索する場合は、次のようにします。

[{"a":true}, {"f":true}, {"g":false}]
.findIndex(function(element){return Object.keys(element)[0] == "g"});

拡張された質問には答えられないことは理解していますが、タイトルには各オブジェクトに何が必要かが指定されていないため、将来的に他の人の頭痛の種を減らすためにこれを謙虚に共有したいと思います。最速のソリューション。

于 2017-02-02T13:46:06.837 に答える
0
var test = [
  {id:1, test: 1},
  {id:2, test: 2},
  {id:2, test: 2}
];

var result = test.findIndex(findIndex, '2');

console.log(result);

function findIndex(object) {
  return object.id == this;
}

インデックス1を返します(ES 2016でのみ機能します)

于 2017-11-01T10:03:08.057 に答える
0

ネストされているオブジェクトの深さに関係なく、オブジェクト内の任意の値と簡単に比較できるため、このメソッドが気に入っています。

 while(i<myArray.length && myArray[i].data.value!==value){
  i++; 
}
// i now hows the index value for the match. 
 console.log("Index ->",i );
于 2019-04-05T14:07:13.180 に答える
0

特定の一致に基づいて配列内のオブジェクトのインデックスを見つける簡単な方法の1つ。

//list of bookings
const bookings = [
    { status: "accepted", _id: "6055cadd062eb5153c089121", title: "This is test title", user: "id", team: "id" },
    { status: "pending", _id: "6055cb33062eb5153c089122", title: "title1", description: "test description", user: "id", team: "id" },
    { status: "accepted", _id: "6055cb3d062eb5153c089123", title: "title2", description: "test description", user: "id", team: "id" }
]

//return index of the element if find else return -1 
const findIndex = (booking) => bookings.findIndex((b, index) => {
    if (b._id === booking._id) return true
})

//test 1
let booking = { status: "pending", _id: "6055cb33062eb5153c089122", title: "title2", description: "test description", user: "id", team: "id" }
console.log("index >>> ", findIndex(booking))
//output : 1

//test 2
booking = { status: "rejected", _id: "6055cb33062eb5153c089198", title: "title3", description: "test description", user: "id", team: "id" }
console.log("index >>> ", findIndex(booking))
//output : -1

//test 3
const id = '6055cb3d062eb5153c089123'
console.log("index >>> ", findIndex({ _id: id }))
//output : 2

find-searchElementInArrayObObjects

于 2021-04-13T20:14:54.193 に答える