Подтвердить что ты не робот

Получение индекса элемента массива на основе его свойств

У меня есть такой массив JavaScript, как это:

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

Каждый объект имеет уникальный id среди других свойств:

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

Как я могу получить индекс определенного объекта в этом массиве, если я знаю его свойство id? Итак, если я знаю, что myArray[x].id == 4, как я могу найти x?

4b9b3361

Ответ 1

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

Для IE ниже версии 9 map нужен патч или просто используйте цикл.

Ответ 2

Или с синтаксисом ES6:

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

или

let index = myArray.findIndex( el => el.id === 4 )

Ответ 3

Почему бы просто не сделать цикл?

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

Тот факт, что в js (или js-библиотеках) существует множество объектов, не означает, что вы не должны, иногда, писать цикл. Это быстро и просто.

Ответ 4

ES6 Array.findIndex

const myArray = [{id:1}, {id:2}, {id3}];
const foundIndex = myArray.findIndex((el) => (el.id === 3));

Ответ 5

Вы можете использовать .reduce(), который позволяет уменьшить массив до одного значения.

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

-1 - значение по умолчанию, если совпадение не найдено.


Если у вас несколько применений для этого, вы можете создать функцию factory.

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

И затем используйте его вот так.

var obj_idx = myArray.reduce(idxForID(4), -1);

Ответ 6

Если каждый идентификатор уникален, вы можете сделать это следующим образом:

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

Ответ 7

Вы также можете попробовать рекурсивную функцию, хотя @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);
};