Найти объект по идентификатору в массиве объектов JavaScript - PullRequest
1343 голосов
/ 09 сентября 2011

У меня есть массив:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

Я не могу изменить структуру массива. Мне передают идентификатор 45, и я хочу получить 'bar' для этого объекта в массиве.

Как мне сделать это в JavaScript или с помощью jQuery?

Ответы [ 31 ]

1437 голосов
/ 09 сентября 2011

Поскольку вы уже используете jQuery, вы можете использовать функцию grep , предназначенную для поиска в массиве:

var result = $.grep(myArray, function(e){ return e.id == id; });

В результате получается массив с найденными элементами.Если вы знаете, что объект всегда присутствует и что он встречается только один раз, вы можете просто использовать result[0].foo, чтобы получить значение.В противном случае вы должны проверить длину полученного массива.Пример:

if (result.length == 0) {
  // not found
} else if (result.length == 1) {
  // access the foo property using result[0].foo
} else {
  // multiple items found
}
830 голосов
/ 15 февраля 2016

Используйте метод find():

myArray.find(x => x.id === '45').foo;

С MDN :

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


Если вы хотите найти вместо него index , используйте findIndex():

myArray.findIndex(x => x.id === '45');

From MDN :

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


Если вы хотите получить массив совпадающих элементов, используйте метод filter() вместо:

myArray.filter(x => x.id === '45');

Это вернет массив объектов.Если вы хотите получить массив foo свойств, вы можете сделать это с помощью метода map():

myArray.filter(x => x.id === '45').map(x => x.foo);

Примечание: такие методы, как find()или filter() и функции стрелок не поддерживаются более старыми браузерами (например, IE), поэтому, если вы хотите поддерживать эти браузеры, вы должны перенести свой код, используя Babel polyfill ).

351 голосов
/ 09 сентября 2011

Другое решение - создать объект поиска:

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}

... now you can use lookup[id]...

Это особенно интересно, если вам нужно сделать много поисков.

Для этого не потребуется намного больше памяти, поскольку идентификаторы и объекты будут общими.

162 голосов
/ 11 февраля 2014

ECMAScript 2015 предоставляет метод find () для массивов:

var myArray = [
 {id:1, name:"bob"},
 {id:2, name:"dan"},
 {id:3, name:"barb"},
]

// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);

// print
console.log(item.name);

Работает без внешних библиотек.Но если вы хотите поддержку старых браузеров , вы можете включить этот полифилл .

140 голосов
/ 22 ноября 2012

Underscore.js имеет хороший метод для этого:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
125 голосов
/ 09 сентября 2011

Я думаю, что самый простой способ будет следующим, но он не будет работать в Internet Explorer 8 (или более ранней версии):

var result = myArray.filter(function(v) {
    return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property
66 голосов
/ 09 сентября 2011

Попробуйте следующее

function findById(source, id) {
  for (var i = 0; i < source.length; i++) {
    if (source[i].id === id) {
      return source[i];
    }
  }
  throw "Couldn't find object with id: " + id;
}
43 голосов
/ 16 апреля 2015
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
30 голосов
/ 14 июля 2012

Общая и более гибкая версия функции findById, приведенной выше:

// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
    for (var i = 0; i < array.length; i++) {
        if (array[i][key] === value) {
            return array[i];
        }
    }
    return null;
}

var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');
14 голосов
/ 09 сентября 2011

Вы можете легко получить это, используя функцию map () :

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var found = $.map(myArray, function(val) {
    return val.id == 45 ? val.foo : null;
});

//found[0] == "bar";

Рабочий пример: http://jsfiddle.net/hunter/Pxaua/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...