Как получить индекс объекта по его свойству в 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 ]

1 голос
/ 18 июля 2017
var fields = {
teste:
{
    Acess:
    {
        Edit: true,
      View: false

      }
 },
teste1:
{
    Acess:
    {
        Edit: false,
      View: false

      }
  }
};

console.log(find(fields,'teste'));
function find(fields,field){
    for(key in fields){
        if(key == field){
        return true;
    }
}
return false;
}

Если у вас есть один объект с несколькими объектами внутри, если вы хотите знать, включен ли какой-либо объект в главный объект, просто поместите find (MasterObject, 'Object to Search'), эта функция вернет ответ, если он существует или нет ( ИСТИНА или ЛОЖЬ), я надеюсь помочь с этим, можете увидеть пример на JSFiddle .

1 голос
/ 18 января 2017

А как насчет этого?:

Data.indexOf(_.find(Data, function(element) {
  return element.name === 'John';
}));

Предполагается, что вы используете lodash или underscorejs.

1 голос
/ 04 февраля 2012

Это может быть полезно

function showProps(obj, objName) {  
  var result = "";  
  for (var i in obj)  
    result += objName + "." + i + " = " + obj[i] + "\n";  
  return result;  
}

Скопировано из https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects

1 голос
/ 30 ноября 2015

Расширенный ответ Криса Пикетта, потому что в моем случае мне нужно было искать глубже, чем один уровень атрибута:

function findWithAttr(array, attr, value) {
  if (attr.indexOf('.') >= 0) {
    var split = attr.split('.');
    var attr1 = split[0];
    var attr2 = split[1];
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr1][attr2] === value) {
        return i;
      }
    }
  } else {
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr] === value) {
        return i;
      }
    }
  };
};

Вы можете передать attr1.attr2 в функцию

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

Вы можете использовать Array.sort, используя пользовательскую функцию в качестве параметра для определения вашего механизма сортировки.

В вашем примере это даст:

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

Data.sort(function(a, b){
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'

Функция сортировки должна возвращать либо-1, если a должен предшествовать b, 1, если a следует после b, и 0, если оба равны.Вам нужно определить правильную логику в вашей функции сортировки для сортировки массива.

Редактировать: Пропущена последняя часть вашего вопроса, где вы хотите узнать индекс.Вы должны были бы пройтись по массиву, чтобы найти это, как говорили другие.

0 голосов
/ 26 января 2018
collection.findIndex(item => item.value === 'smth') !== -1
0 голосов
/ 04 ноября 2014

В качестве альтернативы ответу Аттанасио Руиса из Германии вы можете устранить 2-й цикл, используя Array.reduce () вместо Array.map ();

var Data = [
    { name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
    return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...