Как работать с массивом для поиска элемента
Что проверяют
Знаете ли вы разницу между методами поиска: что каждый возвращает, как сравнивает и сколько стоит. Короткая задача быстро показывает, понимаете ли вы строгое равенство и сравнение объектов по ссылке. Следом почти всегда спрашивают, что делать, если искать нужно тысячи раз.
Как отвечать
Разложите методы по тому, что нужно получить:
includes: есть ли значение, возвращаетtrueилиfalse. Сравнивает по SameValueZero, поэтому находитNaN;indexOfиlastIndexOf: позиция или-1. Сравнивают строго, как===, иNaNне находят никогда;findиfindIndex: первый элемент по условию или его индекс. Если ничего нет, вернутundefinedи-1;findLastиfindLastIndex: то же с конца массива, появились в ES2023;some: есть ли хоть один элемент по условию, останавливается на первом совпадении;filter: все подходящие элементы в новом массиве, всегда проходит массив целиком.
Объекты сравниваются по ссылке: users.indexOf({ id: 1 }) вернёт -1, даже если объект с такими полями в массиве есть. Для объектов нужен find с условием по полю.
Все эти методы работают за O(n). Если поиск повторяется много раз, один раз постройте Map по ключу или Set значений и ищите за O(1) в среднем. Для большого отсортированного массива подойдёт бинарный поиск за O(log n). В React такую Map пересчитывают через useMemo, а не на каждый рендер.
Где спотыкаются
Пишут if (arr.indexOf(x)). Элемент на позиции 0 даёт ложь, а отсутствующий элемент с -1 даёт истину: условие работает ровно наоборот.
Проверяют результат find через if (result). Найденные 0, пустая строка или false считаются ненайденными, проверять нужно result !== undefined или использовать findIndex.
Пишут filter(...)[0] или filter(...).length > 0 вместо find и some. Создаётся лишний массив, и список обходится целиком даже после совпадения.