Поиск объекта в массиве объектов JavaScript с совпадающим значением
У меня есть массив:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, ...]
Я не могу изменить структуру массива. Мне передан id
, равный 45
, и я хочу получить значение foo
для соответствующего объекта в массиве, то есть 'bar'
.
Как я могу сделать это с помощью JavaScript или jQuery?
5 ответ(ов)
Другим решением является создание объекта для поиска:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
// ... теперь вы можете использовать lookup[id] ...
Это особенно интересно, если вам нужно сделать много обращений по ключу.
Такой метод не потребует значительно больше памяти, так как идентификаторы и объекты будут разделяться.
Я думаю, что самый простой способ будет следующим, но он не будет работать в Internet Explorer 8 (или более ранних версиях):
var result = myArray.filter(function(v) {
return v.id === '45'; // Фильтруем нужный элемент
})[0].foo; // Получаем результат и обращаемся к свойству foo
Если вам нужно, чтобы код работал в IE8 или ранее, вам может потребоваться использовать цикл for
вместо метода filter
, так как он не поддерживается в этих версиях.
Попробуйте следующее:
function findById(source, id) {
for (var i = 0; i < source.length; i++) {
if (source[i].id === id) {
return source[i];
}
}
throw "Не удалось найти объект с id: " + id;
}
Эта функция findById
принимает массив объектов source
и идентификатор id
. Она проходит через все элементы массива и проверяет, совпадает ли идентификатор элемента с заданным. Если объект найден, он возвращается, иначе выбрасывается исключение с сообщением о том, что объект не найден.
Вы можете использовать метод filter
для поиска элемента в массиве myArray
по определенному id
. Однако, если вам нужно получить только первый элемент, который соответствует условию, рекомендуется использовать метод find
, который возвращает первый найденный элемент и будет более производительным.
Вот пример, как это можно сделать:
const result = myArray.find(function(a) { return a.id === some_id_you_want; });
При этом, если вы всё же хотите использовать filter
, ваш изначальный код будет возвращать массив, в котором будет только один элемент (или пустой массив, если ничего не найдено). Чтобы получить именно первый элемент, вы можете сделать это:
const result = myArray.filter(function(a) { return a.id === some_id_you_want; })[0];
Однако, учтите, что использование метода find
предпочтительнее в данном случае.
Вот более универсальная и гибкая версия функции 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');
Эта функция objectFindByKey
принимает массив объектов, ключ для поиска и значение, которое нужно найти. Она перебирает массив и возвращает первый объект, который содержит указанный ключ с заданным значением. Если такой объект не найден, функция вернет null
.
В приведенном примере массив объектов содержит два объекта с ключом id
. Мы вызываем функцию с параметрами array
, id
и 45
, чтобы найти объект с id
, равным 45
. В результате мы получим объект {'id':'45', 'foo':'bar'}
. Если бы мы искали id
, равный 99
, функция вернула бы null
, поскольку такого объекта в массиве нет.
Как проверить, является ли объект массивом?
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как удалить все дубликаты из массива объектов?