JavaScript: поиск объекта в массиве и сортировка по свойству
Быстрый ответ
Чтобы определить индекс объекта в массиве по заданному значению свойства, особенно полезен метод Array.prototype.findIndex().
const index = [{ id: 1 }, { id: 2 }].findIndex(obj => obj.id === 2); // значение index станет равно 1
Мы подробно рассмотрим различные аспекты: от вопросов совместимости с браузерами до обработки сложных ситуаций и оценки влияния на производительность.
Техники и сценарии использования
Комбинация map() и indexOf() для обеспечения обратной совместимости
Если у вас отсутствует поддержка ES6, полезной альтернативой может стать комбинация методов map()
и indexOf()
:
var items = [{ id: 1 }, { id: 2 }];
var values = items.map(function(item) {
return item.id;
});
var index = values.indexOf(2); // index будет равен 1 (это особенно актуально для Internet Explorer!)
Проверка поддержки специфических методов весьма критична для предотвращения неожиданных ошибок.
Создание собственной функции для работы со сложными структурами
Для вложенных объектов или нестандартных условий поиска рациональным решением будет создание собственной функции, выполняющей перебор элементов массива:
function findIndexByProperty(array, propName, propValue) {
for(var i = 0; i < array.length; i++) {
if(array[i][propName] === propValue) {
return i; // Найдено! Если бы и носки так просто находились...
}
}
return -1; // Не нашли, как и носки.
}
Такая функция предоставит вам большую гибкость в поиске согласно различным условиям.
Эффективный поиск в больших массивах данных
При работе с большими наборами данных нельзя забывать о производительности. В этом случае подойдет метод findIndex()
, который останавливается при нахождении первого соответствия:
Обработка ситуаций, когда элементы отсутствуют
Не менее важно помнить, что findIndex()
вернёт -1
, если значение свойства не будет найдено. Это крайне важно с той точки зрения, что позволяет избежать ошибок:
const index = items.findIndex(item => item.id === 3); // index равен -1 (объект не найден)
Практика применения лучших подходов
Использование цепочек вызовов методов для создания элегантного кода
Если вам требуется выполнять несколько операций, например, сортировка и последующий поиск, использование цепочек методов поможет сделать ваш код более изящным:
const index = items.sort((a, b) => a.id – b.id).findIndex(item => item.id === 2); // Всё в одну строку, удобно и компактно.
Раздельное управление логикой сортировки и поиска
Иногда целесообразно отделить логику сортировки и поиска индекса. Это способствует лучшему пониманию кода и упрощает его поддержку.
Ключевая роль знакомства с официальной документацией
Документация MDN — это незаменимый источник знаний по JavaScript, который следует всегда иметь под рукой.
Визуализация
Представьте склад, на котором расположены коробки, каждая из которых является объектом с разными свойствами:
Склад: [коробка1, коробка2, коробка3, коробка4]
Ищем свойство: 'размер', значение 'средний'
И у вас есть волшебный фонарик, который мгновенно обнаруживает нужную коробку:
Сканируем... коробка1... коробка2 (размер: 'средний')... Нашли на позиции 1!
Именно так в современном JavaScript происходит поиск нужного элемента:
const boxes = [{size: 'small'}, {size: 'medium'}, {size: 'large'}];
const index = boxes.findIndex(box => box.size === 'medium'); // И вуаля, index выбрался равным 1
С помощью одного короткого вызова findIndex()
вы быстро находите нужные вам данные на вашем виртуальном складе.
Нужно ли сортировать объекты перед поиском
Сортировка и поиск — это разные операции, но иногда они идут вместе. Если перед поиском нужно отсортировать элементы, то сначала выполните сортировку, а потом займитесь поиском:
const people = [{ name: 'Мэри' }, { name: 'Джон' }, { name: 'Стив' }];
people.sort((a, b) => a.name.localeCompare(b.name));
const index = people.findIndex(person => person.name === 'Джон'); // Значение index будет зависеть от результатов сортировки
Будьте готовы к решению этих задач в разных ситуациях!
Полезные материалы
- Array.prototype.findIndex() – JavaScript | MDN — полная документация по Array.prototype.findIndex() на MDN.
- javascript – Get the index of the object inside an array, matching a condition – Stack Overflow — обсуждение метода
findIndex
на форуме Stack Overflow. - ECMAScript 2015 Language Specification – ECMA-262 6th Edition — стандарт ECMA-262 6-го издания с подробным описанием Array.prototype.findIndex.
- Методы массивов — анализ методов find и findIndex на ресурсе learn.javascript.ru.
- arrays – How can I get the index of an object by its property in JavaScript? – Stack Overflow — обсуждение получения индекса объекта на базе Stack Overflow.
- JavaScript Array findIndex() Method — подробности о методе findIndex() на сайте W3Schools.
- Medium: ES6 Arrow Functions & the FindIndex Array Method — детальное объяснение работы стрелочных функций ES6 и метода findIndex на площадке Medium.