21

Поиск объекта в массиве объектов JavaScript с совпадающим значением

14

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

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

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

Как я могу сделать это с помощью JavaScript или jQuery?

5 ответ(ов)

3

Другим решением является создание объекта для поиска:

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

// ... теперь вы можете использовать lookup[id] ...

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

Такой метод не потребует значительно больше памяти, так как идентификаторы и объекты будут разделяться.

1

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

var result = myArray.filter(function(v) {
    return v.id === '45'; // Фильтруем нужный элемент
})[0].foo; // Получаем результат и обращаемся к свойству foo

Если вам нужно, чтобы код работал в IE8 или ранее, вам может потребоваться использовать цикл for вместо метода filter, так как он не поддерживается в этих версиях.

0

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

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. Она проходит через все элементы массива и проверяет, совпадает ли идентификатор элемента с заданным. Если объект найден, он возвращается, иначе выбрасывается исключение с сообщением о том, что объект не найден.

0

Вы можете использовать метод 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 предпочтительнее в данном случае.

0

Вот более универсальная и гибкая версия функции 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, поскольку такого объекта в массиве нет.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь