Получение индекса объекта в массиве

257
18 марта 2017, 02:28

Всем привет! Нужно не столько решение, сколько подсказка. Как получить индекс объекта в массиве типа - [1, 2, 3, 4] - понятно. Не могу понять, как получить индекс объекта вот в таком массиве:

var arrayId = [
    {id: 12},
    {id: 12},
    {id: 12},
    {id: 123},
    {id: 126},
    {id: 1},
    {id: 15},
    {id: 33}
];

Или, если есть уже ответ, то киньте ссылку, ибо не нашел.

Заранее спасибо!

Answer 1

Весь фокус в том, что в массиве хранятся не сами объекты, а указатели на них и indexOf сравнивает именно указатели. Если мы сконструируем два объекта с одинаковыми полями, то это будут разные объекты

var obj1 = {id: 1}; 
var obj2 = {id: 1}; 
console.log(obj1 == obj2);  // false

поэтому Вам придется пробежаться в цикле по всему массиву и самостоятельно сравнить объект с каждым элементом массива. Или, как подсказал @Grundy, использовать метод findIndex c callback-функцией

При этом, если Вы не будете конструировать новый объект, а предварительно добудете его из массива, то будет работать и indexOf

var arrayId = [ 
  {id: 12}, 
  {id: 12}, 
  {id: 12}, 
  {id: 123}, 
  {id: 126}, 
  {id: 1}, 
  {id: 15}, 
  {id: 33} 
]; 
 
function indexObj(AObj) { 
  for (var i = 0; i < arrayId.length; i++) { 
    if (arrayId[i].id == AObj.id) 
      return i; 
  } 
  return -1; 
} 
 
console.log(arrayId.indexOf({id: 1})); 
console.log(indexObj({id: 1})); 
var obj = arrayId[2]; 
console.log(arrayId.indexOf(obj)); 
 
console.log( 
  arrayId.findIndex( 
    function (AEl) { 
      return AEl.id == this.id; 
    }, 
    {id: 1} 
  ) 
);

Answer 2

Можно воспользоваться парой функций:

  • filter - выбираем только соответствующие объекты
  • indexOf - получаем индекс первого из найденных

var arrayId = [ 
  {id: 12}, 
  {id: 12}, 
  {id: 12}, 
  {id: 123}, 
  {id: 126}, 
  {id: 1}, 
  {id: 15}, 
  {id: 33} 
]; 
 
function find(list, id) { 
  var ok = list.filter(a => a.id === id); 
  if (!ok.length) return -1; 
  return list.indexOf(ok[0]); 
} 
 
console.log(find(arrayId, 12)); 
console.log(find(arrayId, 1)); 
console.log(find(arrayId, 126));

В этом решении выполняется лишний проход по массиву по сравнению с самостоятельной выборкой в цикле.

READ ALSO
Как изменить HTML внутри div span span на чистом JavaScript

Как изменить HTML внутри div span span на чистом JavaScript

Всем приветКак изменить HTML внутри div span span на чистом JavaScript? делаю пока так

300
Как построить дерево ссылок на javascript?

Как построить дерево ссылок на javascript?

Подскажите пожалуйста как на javascript реализовать дерево ссылокНапример есть такой массив

348
undefined добавляется к массиву

undefined добавляется к массиву

Когда вывожу элементы подмассива в ячейки таблицы через цикл for, то первым выводится undefined, а потом уже все элементы: undefined Hello world Phrase 23 qwerty...

261