34

次のようなオブジェクトの JavaScript 配列があります。

var myArray = [{...}, {...}, {...}];

各オブジェクトにはid、他のプロパティの中で一意のものがあります。

{ 
  id: 4,
  property1: 'something',
  property2: 'something'
}

idプロパティしか知らない場合、その配列内の特定のオブジェクトのインデックスを取得するにはどうすればよいですか? それで、それがわかっている場合myArray[x].id == 4、どうすれば見つけることができますxか?

4

7 に答える 7

63
var index = myArray.map(function(el) {
  return el.id;
}).indexOf(4);

バージョン 9 未満の IE の場合、マップにパッチが必要か、単にループを使用します。

于 2012-09-23T15:00:49.340 に答える
21

または ES6 構文で:

let index = myArray.map( el => el.id ).indexOf(4)

また

let index = myArray.findIndex( el => el.id === 4 )
于 2015-12-31T15:34:24.993 に答える
7

単にループを作ってみませんか?

function indexOfId(array, id) {
    for (var i=0; i<array.length; i++) {
       if (array[i].id==id) return i;
    }
    return -1;
}

js (または js ライブラリ) に多くの機能があるという事実は、場合によってはループを作成してはならないという意味ではありません。それは速くて簡単です。

于 2012-09-23T14:46:03.090 に答える
0

各 ID が一意の場合、次のようにできます。

o1 = {id:1}
o2 = {id:2}
o3 = {id:3}
o4 = {id:4}
a = [o1,o2,o3,o4]
a.indexOf( a.filter( function(i){return i.id==4} )[0] );
于 2012-09-23T15:02:10.600 に答える
0

@xdazz はかなり魅力的に見えますが、再帰関数を試すこともできます。

var indexOfId = function(arr, id, index) {
    if (!index) { index = 0; }
    if (arr[index].id == id) {
      return index;
    }
    return ((index += 1) >= arr.length) ? -1 : indexOfId(arr, id, index);
};
于 2012-09-23T15:03:20.103 に答える
0

を使用する.reduce()と、配列を単一の値に減らすことができます。

var obj_idx = myArray.reduce(function(idx, item, i) {
  return item.id === 4 ? i : idx;
}, -1);

-1一致が見つからない場合のデフォルト値です。


これに複数の用途がある場合は、関数ファクトリを作成することをお勧めします。

function idxForID(target) {
    return function(idx, item, i) {
      return item.id === target ? i : idx;
    };
}

そして、このように使用します。

var obj_idx = myArray.reduce(idxForID(4), -1);
于 2012-09-23T14:58:18.217 に答える