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);

对于 IE 9 以下,map需要补丁,或者只使用循环。

于 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 回答
3

ES6 Array.findIndex

const myArray = [{id:1}, {id:2}, {id3}];
const foundIndex = myArray.findIndex((el) => (el.id === 3));
于 2017-01-31T06:41:46.617 回答
0

您可以使用.reduce(),它可以让您将 Array 缩减为单个值。

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 回答
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 回答