Как получить индекс объекта по его свойству в JavaScript? - PullRequest
190 голосов
/ 24 августа 2011

Например, у меня есть:

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

Тогда я хочу отсортировать / перевернуть этот объект, например, name.Я получаю что-то вроде этого:

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

И теперь я хочу знать индекс объекта со свойством name='John', чтобы получить значение токена свойства.

Ответы [ 17 ]

261 голосов
/ 04 апреля 2014

Поскольку на сортировку уже дан ответ. Я просто собираюсь предложить другой элегантный способ получить indexOf свойства в вашем массиве

Ваш пример:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},
    {id_list:2,name:'John',token:'123123'}
]

Вы можете сделать:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');

Array.prototype.map недоступно в IE7 или IE8. ES5 Совместимость

А вот с ES6 и синтаксисом стрелок, что еще проще:

const index = Data.map(e => e.name).indexOf('Nick');
156 голосов
/ 16 сентября 2016

Если вы в порядке с ES6.Массивы теперь имеют функцию findIndex .Это означает, что вы можете сделать что-то вроде этого:

const index = Data.findIndex(item => item.name === 'John');
144 голосов
/ 24 августа 2011

Как показывают другие ответы, циклически проходить по массиву, вероятно, является наилучшим способом.Но я бы поставил его в его собственную функцию и сделал его немного более абстрактным:

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

var Data = [
    {id_list: 2, name: 'John', token: '123123'},
    {id_list: 1, name: 'Nick', token: '312312'}
];

С этим вы можете не только найти, какой из них содержит «Иоанна», но и найти, который содержит токен.312312 ':

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1

РЕДАКТИРОВАТЬ: Обновлена ​​функция для возврата -1, когда не найден, поэтому она следует той же конструкции, что и Array.prototype.indexOf ()

17 голосов
/ 19 марта 2018
var index = Data.findIndex(item => item.name == "John")

Что является упрощенной версией:

var index = Data.findIndex(function(item){ return item.name == "John"})

С mozilla.org:

Метод findIndex () возвращает индекс первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. В противном случае возвращается -1.

8 голосов
/ 03 января 2019

Если у вас есть проблемы с IE, вы можете использовать функцию map (), которая поддерживается начиная с 9.0:

var index = Data.map(item => item.name).indexOf("Nick");
4 голосов
/ 24 августа 2011

Единственный известный мне способ - перебрать весь массив:

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name==="John"){index=i;break;}

или без учета регистра:

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name.toLowerCase()==="john"){index=i;break;}

В переменной результата index содержит индекс объекта или -1, если не найден.

2 голосов
/ 24 июля 2013

по прототипу

(function(){
  if (!Array.prototype.indexOfPropertyValue){
    Array.prototype.indexOfPropertyValue = function(prop,value){
      for (var index = 0; index < this.length; index++){
        if (this[index][prop]){
          if (this[index][prop] == value){
            return index;
          }
        }
      }
      return -1;
    }
  }
 })();
 // usage:
 var Data = [
 {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}];
 Data.indexOfPropertyValue('name','John'); // returns 1 (index of array);
 Data.indexOfPropertyValue('name','Invalid name') // returns -1 (no result);
 var indexOfArray = Data.indexOfPropertyValue('name','John');
 Data[indexOfArray] // returns desired object.
2 голосов
/ 24 января 2015

Почему бы вам не использовать небольшой обходной путь?

Создать новый массив с именами в качестве индексов. после этого все поиски будут использовать индексы. Итак, всего одна петля. После этого вам не нужно перебирать все элементы!

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
    ]
var searchArr = []
Data.forEach(function(one){
  searchArr[one.name]=one;
})
console.log(searchArr['Nick'])

http://jsbin.com/xibala/1/edit

живой пример.

1 голос
/ 24 августа 2011

Просто пройдите через ваш массив и найдите позицию:

var i = 0;
for(var item in Data) {
    if(Data[item].name == 'John')
        break;
    i++;
}
alert(i);
1 голос
/ 04 сентября 2017
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";

theArray.every(function (element, index) {

    if (element[theProperty] === searchFor) {
        indexOf = index;
        return false;
    }
    return true;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...