Есть массив с английским алфавитом:
let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
Хочу определить, какой у буквы f
индекс в массиве. Есть ли функция с необходимым мне функционалом и можно ли это сделать не прогоняя весь массив через цикл?
задан 25 июн 2018 в 18:34
JamesJGoodwinJamesJGoodwin
3,9766 золотых знаков35 серебряных знаков70 бронзовых знаков
Используйте indexOf
alphabet.indexOf('f')
Кстати, indexOf
есть и у строк.
// строка abc...
let str_alpha = String.fromCharCode(...[...Array(26).keys()].map(i=>i+97));
console.log(str_alpha.indexOf('f'));
// массив 'a', 'b', 'c'...
let arr_alpha = str_alpha.split('');
console.log(arr_alpaha);
ответ дан 25 июн 2018 в 18:40
функция с … функционалом
зачет по русскому языку сдан.
var alphabetIndices = {
...
f: 5,
...
};
var someLetter = 'f';
var index = alphabetIndices[someLetter]; // 5
Такое решение позволяет определять индекс буквы в алфавите, не заботясь о регистре:
var alphabetIndices = {
...
f: 5, F: 5,
...
};
или использовать его для получения натурального номера буквы:
var alphabetOrdinals = {
...
f: 6, F: 6,
...
};
ответ дан 25 июн 2018 в 18:36
12
еще вариант через indexOf():
let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
let res = alphabet.indexOf('v');
console.log(res)
ответ дан 25 июн 2018 в 18:44
let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
console.log(alphabet.findIndex(item => item === 'e'));
console.log(alphabet.findIndex(item => item === 'x'));
console.log(alphabet.findIndex(item => item === 'a'));
console.log(alphabet.findIndex(item => item === 'd'));
ответ дан 25 июн 2018 в 18:50
RifmaManRifmaMan
1,7561 золотой знак7 серебряных знаков19 бронзовых знаков
Если без объявленного цикла, то можно так, но что под капотом во внутренних методах Array: split, join, toString, slice я не знаю, возможно в своих инструкциях и имеют циклы. Также можно создать и в последующем использовать, внутренний объект для записи искомых ключей.
var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
/*
// v.1
var someLetter = 'z';
var result = (function(_first, _second){return [--_first.split(",").length, -(_second.split(",").length)]}).apply(null, ("," + alphabet.join() + ",").split("," +someLetter + ","));
console.log(alphabet[result[0]]);
console.log(alphabet.slice(result[0]).shift());
console.log(alphabet.slice(result[1]).shift());
*/
// v.2.0.1
Array.prototype["_indexSide_"] = function(_markerName, _flag){
return (function(_first, _second){
return !!_second && !!_flag? // v.2.0.1 если _second при разделении равен undefined то метод вернёт несуществующий индекс
// return !!_flag? // v.2
-(_second.split(",").length) // если _flag true то вернёт отрицательный порядковый индекс маркера с конца массива
:
--_first.split(",").length; // если _flag не передан или false, метод возвращает порядковый индекс маркера от начала массива
}).apply(null, (","
+ this.toString() // v.2.0.1
// + this.join() // v.2
+ ",").split("," +_markerName + ","))
}
console.log(alphabet[alphabet._indexSide_("f")]);
console.log(alphabet.slice(alphabet._indexSide_("a")).shift());
console.log(alphabet.slice(alphabet._indexSide_("z", true)).shift());
console.log(alphabet[alphabet._indexSide_("figvam")]);
ответ дан 25 июн 2018 в 20:36
L11VADISL11VADIS
6086 серебряных знаков11 бронзовых знаков
-
Главная
-
Инструкции
-
JavaScript
-
Методы поиска в массивах JavaScript
Поиск в массиве — довольно несложная задача для программиста. На ум сразу приходит перебор через цикл for или бинарный поиск в отсортированном массиве, для элементов которого определены операции «больше» и «меньше». Но, как и любой высокоуровневый язык программирования, JavaScript предлагает разработчику встроенные функции для решения различных задач. В этой статье мы рассмотрим четыре метода поиска в массивах JavaScript: find
, includes
, indexOf
и filter
.
indexOf
indexOf
— это функция поиска элемента в массиве. Этот метод с помощью перебора ищет искомый объект и возвращает его индекс или «-1», если не находит подходящий.
Синтаксис
Функция имеет такой синтаксис:
Array.indexOf (search element, starting index)
где:
- Array — массив;
- search element — элемент, который мы ищем;
- starting index — индекс, с которого начинаем перебор. Необязательный аргумент, по умолчанию работа функции начинается с индекса “0”, т.е. метод проверяет весь Array. Если starting index больше или равен Array.length, то метод сразу возвращает “-1” и завершает работу.
Если starting index отрицательный, то JS трактует это как смещение с конца массива: при starting index = “-1” будет проверен только последний элемент, при “-2” последние два и т.д.
Практика
Опробуем метод на практике. Запустим такой код и проверим результаты его работы:
let ExampleArray = [1,2,3,1,'5', null, false, NaN,3];console.log("Позиция единицы", ExampleArray.indexOf(1) );
console.log("Позиция следующей единицы", ExampleArray.indexOf(1,2) );
console.log("Позиция тройки", ExampleArray.indexOf(3) );
console.log("Позиция тройки, если starting index отрицательный", ExampleArray.indexOf(3,-2) );
console.log("Позиция false", ExampleArray.indexOf(false) );
console.log("Позиция 5", ExampleArray.indexOf("5") );
console.log("Позиция NaN", ExampleArray.indexOf(NaN));
В результате работы этого кода мы получили такой вывод:
Позиция единицы 0
Позиция следующей единицы 3
Позиция тройки 2
Позиция тройки, если starting index отрицательный 8
Позиция false 6
Позиция 5 -1
Позиция NaN -1
indexOf
осуществляет поиск элемента в массиве слева направо и останавливает свою работу на первом совпавшем. Отчетливо это проявляется в примере с единицей. Для того, чтобы идти справа налево, используйте метод LastIndexOf
с аналогичным синтаксисом.
Для сравнения искомого и очередного объекта применяется строгое сравнение (===). При использовании строгого сравнения для разных типов данных, но с одинаковым значение, например 5, ‘5’ и “5” JavaScript даёт отрицательный результат, поэтому IndexOf
не нашел 5.
Также стоит помнить, что indexOf
некорректно обрабатывает NaN. Так что для работы с этим значением нужно применять остальные методы.
includes
includes
не совсем проводит поиск заданного элемента в массиве, а проверяет, есть ли он там вообще. Работает он примерно также как и indexOf
. В конце работы includes
возвращает «True», если нашел искомый объект, и «False», если нет. Также includes
правильно обрабатывает NaN
Синтаксис
includes
имеет следующий синтаксис:
Array.includes (search element, starting index)
где:
- Array — массив;
- search element — элемент, который мы ищем;
- starting index — индекс, с которого начинаем перебор. Необязательный аргумент, по умолчанию работа функции начинается с индекса “0”, т.е. метод проверяет весь Array. Если starting index больше или равен Array.length, то метод сразу возвращает «False» и завершает работу.
Если starting index отрицательный, то JS трактует это как смещение с конца массива: при starting index = “-1” будет проверен только последний элемент, при “-2” последние два и т.д.
Практика
Немного изменим код из предыдущего примера и запустим его:
let Example = [1,2,3,1,'5', null, false,NaN, 3];console.log("Наличие единицы", Example.includes(1) );
console.log("Наличие следующей единицы", Example.includes(1,2) );
console.log("Наличие тройки", Example.includes(3) );
console.log("Наличие тройки, если starting index отрицательный", Example.includes(3,-1) );
console.log("Наличие false", Example.includes(false) );
console.log("Наличие 5", Example.includes(5) );
console.log("Наличие NaN", Example.includes(NaN));
Вывод:
Наличие единицы true
Наличие следующей единицы true
Наличие тройки true
Наличие тройки, если starting index отрицательный true
Наличие false true
Наличие 5 false
Наличие NaN true
Для includes
отсутствует альтернативная функция, которая проводит поиск по массиву js справа налево, которая, в общем-то, и не очень актуальна.
find
Предположим, что нам нужно найти в массиве некий объект. Но мы хотим найти его не по значению, а по его свойству. Например, поиск числа в массиве со значением между 15 и 20. Как и прежде, мы можем воспользоваться перебором с помощью for
, но это не слишком удобно. Для поиска с определенным условием в JavaScript существует метод find
.
Синтаксис
Array.find(function(...){
//если элемент соответствует условиям (true), то функция возвращает его и прекращает работу;
//если ничего не найдено, то возвращает undefined
})
- Array — массив;
- function(…) — функция, которая задает условия.
Практика
Как и в прошлых примерах, напишем небольшой код и опробуем метод:
let ExampleArray = ["Timeweb", 55555, "Cloud", "облачный провайдер", "буквы"];console.log(ExampleArray.find(element => element.length == 5))
Вывод:
Cloud
В этом примере мы искали строки с длиной в 5 символов. Для числовых типов данных длина не определена, поэтому 55555 не подходит. find
находит первый элемент и возвращает его, поэтому «буквы» также не попали в результат работы нашей функции. Для того, чтобы найти несколько элементов, соответствующих некоторому условию, нужно использовать метод filter
.
Также не стоит забывать о методе findIndex
. Он возвращает индекс подходящего элемента. Или -1, если его нет. В остальном он работает точно также, как и find
.
filter
find
ищет и возвращает первый попавшийся элемент, соответствующий условиям поиска. Для того, чтобы найти все такие элементы, необходимо использовать метод filter
. Результат этой функции — массив (если ничего не найдено, то он будет пустым).
Синтаксис
Array.find(function(...){
//если элемент соответствует условиям (true), то добавляем его к конечному результату и продолжаем перебор;
})
- Array — массив;
- function(…) — функция, которая задает условия.
Практика
Представим следующую задачу: у нас есть список кубоидов (прямоугольных параллелепипедов) с длинами их граней и нам нужно вывести все кубоиды с определенным объемом. Напишем код, реализующий решение данной задачи:
let ExampleArray = [
[10, 15, 8],
[11, 12, 6],
[5, 20, 1],
[10, 10, 2],
[16,2, 4]
];console.log(ExampleArray.filter(element=> element[0]*element[1]*element[2]>300))
Вывод:
[ [ 10, 15, 8 ],
[ 11, 12, 6 ] ]
В этом примере мы нашли прямоугольные параллелепипеды с объемом больше 300. В целом, метод filter
в JS позволяет реализовывать всевозможные условия для поиска.
Заключение
В этой статье узнали о методах поиска в JavaScript и научились ими пользоваться. Все перечисленные методы — универсальные инструменты для разработчиков. Но, как и любые универсальные инструменты, они не всегда являются самыми производительными. Так, например, бинарный поиск будет куда эффективнее, чем find
и filter
.
Перевод статьи 4 Methods to Search Through Arrays in JavaScript.
В JavaScript существует несколько довольно эффективных способов поиска элементов в массивах. В самом простом случае вы всегда можете прибегнуть помощи базового цикла for
, однако в стандарте ES6 + предусмотрено гораздо большое число методов, предназначенных для циклического перебора элементов массива и поиска среди них тех, что нам нужны.
С таким количеством различных методов поиска и перебора, какой из них рациональнее использовать в каждом из отдельных случаев? Например, в ходе поиска в массиве вы хотите просто узнать, находится ли нужный нам элемент в массиве вообще? А может вам нужен только индекс этого элемента или же он сам?
В отношении каждого отдельного метода, который мы рассмотрим далее, важно понимать, что все они являются встроенными, то есть доступны через свойство прототип Array.prototype
. Это означает, что вы можете вызвать их для любого массива, используя точечную нотацию. Это также означает, что все эти методы недоступны для объектов или других типов данных, кроме массивов (хотя частично они могут использоваться для строк).
Далее мы рассмотрим следующие методы массивов Array
:
- Array.includes
- Array.find
- Array.indexOf
- Array.filter
includes
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.includes("thick scales"); // вернет true
Метод .include()
возвращает логическое значение и идеально подходит для определения факта наличия искомого элемента в массиве. То есть он просто отвечает true
или false
. Ниже представлен общий вид его синтаксиса:
arr.includes(valueToFind, [fromIndex]);
Как мы можем заметить, этот метод принимает только один обязательный параметр — valueToFind
. Это значение затем используется для сопоставления со значениями элементов массива arr
. Необязательный параметр fromIndex
— это целое число, предписывающее с какого индекса будет начат поиск. По умолчанию это значение равно 0
, и поэтому поиск будет осуществляться по всему массиву.
Итак, поскольку в нашем примере выше элемент, с которого начнется поиск имеет индекс 0, то возвращается true
. А вот следующая инструкция вернет ложное значение: alligator.include ("thick scales", 1);
, так как в этом случае поиск начинается с элемента с индексом 1
.
Теперь подробнее рассмотрим несколько важных деталей, на которые стоит обратить внимание. Первое — метод .includes()
использует строгое сравнение. Это означает, с учетом уже рассмотренного нами выше примера, что следующая инструкция: alligator.includes('80');
вернет false
. Это происходит потому, что хотя вычисление логического выражения 80 == '80'
приведет к получению результата true
, однако, так как в нашем случае используется строгое сравнение, то 80 === '80'
вернет false
, то есть значения с разными типами никогда не будут проходить эту проверку.
find
Чем же метод .find()
отличается от .include()
? Так если бы мы в нашем примере выше изменили название метода «include» на «find», то получили бы следующую ошибку:
Uncaught TypeError: thick scales is not a function
Это произошло потому, что метод .find()
требует передачи в качестве параметра функцию. Метод .find()
использует не просто оператор сравнения, он передает каждый элемент массива в функцию, передаваемую ему в качестве параметра, и проверяет, возвращает ли она значение true
или false
.
Таким образом, и хотя следующая инструкция будет работать корректно: alligator.find (() => 'thick scale');
, но вы, вероятно, захотите добавить в качестве функции-аргумента свой собственный оператор сравнения для того, чтобы он возвращал что-то нужное нам.
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.find(el => el.length < 12); // вернет '4 foot tail'
Эта простая функция, передаваемая нашему методу .find()
, проверяет каждый элемент массива, доступный по присваиваемому псевдониму el
. Перебор элементов прекращается, когда находится первое совпадение. В нашем случае возвращается true
для такого элемента массива, у которого есть свойство length
, и его значение менее 12 (напомним, что числа не имеют свойства length
). Конечно же, вы можете сделать эту функцию настолько сложной, насколько вам это необходимо, и возвращаемое ей значение соответствовало вашим требованиям.
Заметьте, что результат выполнения нашего кода, из примера выше, не возвращает true
, как это было ранее. Это происходит потому, что метод .find()
не возвращает логическое значение, а возвращает первый элемент, который соответствует критерию, определенному в функции. Если соответствующего элемента, который соответствует критериям, определенным в вашей функции, то метод вернет undefined
. Также обратите внимание, что он возвращает только первый элемент, соответствующий критерию. Таким образом если в массиве более одного элемента, соответствующего критерию в функции, то все равно будет возвращаться только первый, соответствующий критерию в функции. В нашем примере, если бы после элемента со значением 4 foot tail
, был другой со значением, в виде строки длиной менее 12 символов, то это ни как не изменило бы наш результат.
В нашем примере мы по сути использовали функцию обратного вызова, но только с одним параметром. При вызове метода .find()
вы можете использовать еще один параметр у функции: ссылку на индекс текущего элемента нашего массива. Еще одним параметром может быть ссылка на наш массив, но я нахожу, что его использование может пригодиться в очень редких случаях. Вот пример использования ссылки на индекс нашего обрабатываемого массива:
alligator.find((el, idx) => typeof el === "string" && idx === 2); // вернет '4 foot tall'
И так в нашем массиве три различных элемента, которые удовлетворяют условию (typeof el === 'string'
). Если бы это было наше единственное условие, то наш скрипт вернул бы первый элемент массива: thick scales
. Но дело в том, что только у одного из элементов нашего массива индекс равен 2 и это элемент со значением 4 foot tall
.
Говоря об индексах элементов, схожим методом перебора элементов массива является .findIndex()
. Этот метод тоже в качестве параметра принимает функцию, но, как вы уже можете догадаться, он возвращает индекс соответствующего ее критерию элемента, а не его значение.
indexOf
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.indexOf("rounded snout"); // будет возвращено 3
Как и .include()
, метод .indexOf()
использует строгое сравнение, а не функцию, как мы это видели рассматривая особенности использования метода .find()
. Но, в отличие от метода include()
, он возвращает индекс элемента, а не логическое значение. Также вы можете указать, с какого индекса в массиве начинать поиск.
Лично я считаю, что метод .indexOf()
может оказаться весьма полезен. Он позволяет легко определить местоположение искомого элемент в массиве, а также проверить присутствует ли в нем элемент с указанным значением. Как же нам понять существует ли указанный элемент в массиве или нет? По сути, мы можем легко определить это, то есть в случае его наличия метод вернет положительное число, и если нет — то -1
, что указывает на его отсутствие.
alligator.indexOf("soft and fluffy"); // вернет -1 alligator.indexOf(80); // вернет 1 alligator.indexOf(80, 2); // вернет -1
И, как вы можете видеть, хотя мы могли бы получить методы .find()
или .findIndex()
, чтобы предоставить нам ту же информацию, писать это намного меньше. Нам не нужно выписывать функцию для сравнения, так как она уже есть в методе .indexOf()
.
Теперь мы знаем что, метод indexOf()
возвращает индекс первого элемента, соответствующего нашему критерию. Тем не менее JavaScript предоставляет нам альтернативный метод поиска элемента в массиве: .lastIndexOf()
. Как вы можете догадаться, он делает то же самое, что и метод indexOf()
, но начинает поиск с последнего элемента массива в обратном направлении. У этого метода вы также можете указать второй параметр, но помните, что порядок индексов массива остается прежним, не смотря на обратное направление его перебора.
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80]; alligator.indexOf(80); // вернет 1 alligator.lastIndexOf(80); // вернет 4 alligator.indexOf(80, 2); // вернет 4 alligator.lastIndexOf(80, 4); // вернет 4 alligator.lastIndexOf(80, 3); // вернет 1
filter
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80]; alligator.filter(el => el === 80); //вернет [80, 80]
Метод .filter()
похож на метод .find()
тем, что требует передачи в качестве параметра функции, которая определяет критерий для выбора элементов массива, возвращаемых методом. Основное отличие этих методов состоит в том, что .filter()
всегда возвращает массив, даже если найден только один, соответствующий критерию выбора, элемент. То есть он вернет все найденные элементы, тогда как .find()
вернет только первый найденный элемент.
Говоря о методе .filter()
важно понимать, что он возвращает все элементы, соответствующие вашему критерию, то есть все элементы, которые вы хотите “отфильтровать”.
Заключение
В самом простом случае, когда мне необходимо найти в массиве какое-либо значение я использую метод .find()
, но, как вы могли заметить, применение какого-либо метода зависит от конкретного случая.
Вам нужно только узнать существует ли в массиве элемент с определенным значением? Используйте метод .includes()
.
Вам нужно получить сам элемент массива, значение которого соответствует определенному критерию? Используйте методы .find()
или .filter()
для получения элементов.
Вам нужно найти индекс какого-либо элемента? Используйте методы .indexOf()
или .findIndex()
для использования более сложного критерия поиска.
Массивы в примерах, которые мы здесь рассмотрели на самом деле простые. Однако на практике вы можете столкнуться с более сложными случаями, например, с массивами объектов. Вот несколько простых примеров практик, которые вам могут пригодится, для работы с массивами, состоящими из вложенных объектов:
const jungle = [ { name: "frog", threat: 0 }, { name: "monkey", threat: 5 }, { name: "gorilla", threat: 8 }, { name: "lion", threat: 10 } ]; // разберем объект, перед использованием методов поиска .include () или .indexOf () const names = jungle.map(el => el.name); // веренет ['frog', 'monkey', 'gorilla', 'lion'] console.log(names.includes("gorilla")); // веренет true console.log(names.indexOf("lion")); // веренет 3 - что будет соответствовать верному положению элемента, при условии, что сортировка нового массива names не проводилась // methods we can do on the array of objects console.log(jungle.find(el => el.threat == 5)); // веренет объект - {name: "monkey", threat: 5} console.log(jungle.filter(el => el.threat > 5)); // вернет массив - [{name: "gorilla", threat: 8}, {name: 'lion', threat: 10}]
В общем, это отличный пример для ознакомления с методами поиска в массивах. Изучив их, возможно скоро вы сможете стать настоящими профессионалами эффективного использования массивов JavaScript!
Как узнать где находится элемент массива?
Есть массив, допустим c 9 элементами:[1,2,3,4,5,6,7,8,9]
(элементов может быть любое кол-во).
Я могу проверить есть ли цифра 5 в этом массиве или нет[1,2,3,4,5,6,7,8,9].indexOf(5)
Но как узнать где эта 5 находится, то есть в центре массива или нет, если нет, то куда ближе, к концу или к началу, как далеко от конца массива и как далеко от начала.
-
Вопрос заданболее трёх лет назад
-
692 просмотра
var index = [1,2,3,4,5,6,7,8,9].indexOf(5);
Вот так index будет содержать позицию начиная с 0, в данном случае index будет равен 4, а далее при помощи
var length = [1,2,3,4,5,6,7,8,9].length;
узнаете длину массива, и определяет в центре, ближе к началу, или ближе к концу эта 5 находиться.
function midArr(arr, indexOf){
var ind = arr.indexOf(indexOf);
var qrtStep = arr.length/4;
var qrt1 = qrtStep,
qrt2 = qrtStep*2,
qrt3 = qrtStep*3;
if(ind == 0 || ind <= qrt1)
return('"'+indexOf+'" находится в начале');
else if(ind <= qrt2 || ind < qrt3)
return('"'+indexOf+'" находится в середине');
else
return('"'+indexOf+'" находится в конце');
}
var array = [0,1,2,3,4,5,6,7,8,9,10,11];
alert(midArr(array, 8));
codepen.io/anon/pen/EKmxeR?editors=0011
var arr = [1,2,3,4,5,6,7,8,9]; // исходный массив
(function(num){ // объявили самовызывающую функцию
if((arr.length % num) > 0){
console.log('Центр массива находит на элементе ' + Math.round((arr.length / 2)) ); // находим цетр, если массив нечетный
var center = Math.round((arr.length / 2)); // запоминаем точку центра
}else{
console.log('Центр массива находит на элементе ' + (arr.length / 2) + ' и ' + (arr.length / 2 + 1)); // находим цетр, если массив четный
var center = (arr.length / 2); // запоминаем точку центра ( левую))
}
console.log('Элемент отстаёт от начала на ' + arr.indexOf(num) + ' элемента. И на ' + (arr.length - 1 - arr.indexOf(num)) + ' от конца');
if(num === center){ // проверяем 'центральность'
console.log('Бинго! число в центре');
}else{
console.log('Элемент отстаёт от центра :');
(center > num)?console.log((center - num) + ' элементов слева'):console.log(-(center-num) + ' элементов справа'); // тернарный оператором определяем положение от центра
}
})(5); // указываем число из массива, которое будем искать , в данном случаи - 5
всё в консоле, новых переменных минимум. Для массива с четным числом данных, возможно, нужно будет подпилить что то … но мне лень %)
Пригласить эксперта
-
Показать ещё
Загружается…
28 мая 2023, в 02:05
7000 руб./за проект
27 мая 2023, в 23:03
10000 руб./за проект
27 мая 2023, в 22:55
1000 руб./за проект
Минуточку внимания
Содержание
- 1 Array.includes() — есть ли элемент в массиве
- 2 Array.indexOf() — индекс элемента в массиве
- 3 Array.find() — найти элемент по условию
- 4 Array.findIndex() — найти индекс элемента в массиве
- 5 Поиск всех совпадений в массиве
- 6 Поиск в массиве объектов
- 7 Заключение
Для поиска по массиву в JavaScript существует несколько методов прототипа Array, не считая что поиск можно выполнить и методами для перебора массива и в обычном цикле.
Итак, мы сегодня рассмотрим следующие варианты:
- Array.includes()
- Array.indexOf()
- Array.find()
- Array.findIndex()
- Array.filter()
- Array.forEach()
Array.includes() — есть ли элемент в массиве
Данный метод ищет заданный элемент и возвращает true
или false
, в зависимости от результата поиска. Принимает два параметра:
element
— то, что мы будем искатьfromIndex
(необязательный) — с какого индекса начинать поиск. По умолчанию с 0.
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry'];
console.log(arr.includes('Apple')); // true
console.log(arr.includes('Apple', 1)); // false
Как видно из примера выше, в первом случае мы получим true
, т.к. начали с нулевого элемента массива. Во втором случае мы передали второй параметр — индекс, с которого нужно начать поиск — и получили false
, т.к. дальше элемент не был найден.
Array.indexOf() — индекс элемента в массиве
Данный метод, в отличие от предыдущего, возвращает индекс первого найденного совпадения. В случае если элемент не найден, будет возвращено число -1
Также принимает два параметра:
element
— элемент, который мы будем искатьfromIndex
(необязательный) — с какого индекса начинать поиск. По умолчанию с 0.
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
console.log(arr.indexOf('Apple')); // 0
console.log(arr.indexOf('Apple', 1)); // 4
console.log(arr.indexOf('Orange', 2)); // -1
Как видно из примера выше, в первом случае мы получаем 0, т.к. сразу нашли первый элемент массива (первое совпадение, дальше поиск уже не выполняется). Во втором случае 4, т.к. начали поиск с индекса 1 и нашли следующее совпадение. В третьем примере мы получили результат -1, т.к. поиск начали с индекса 2, а элемент Orange в нашем массиве под индексом 1.
Так как данный метод возвращает индекс или -1, мы можем присвоить результат в переменную для дальнейшего использования:
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
const index = arr.indexOf('Lemon');
if (index !== -1) {
// сделать что-то
}
Чтобы произвести какие-то действия над найденным элементом массива, мы можем использовать следующий синтаксис:
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
const index = arr.indexOf('Lemon');
arr[index] = 'Lime'; // заменяем найденный элемент
console.log(arr)ж // ['Apple', 'Orange', 'Lime', 'Cherry', 'Apple']
Примеры использования данного метода вы можете также найти в посте про удаление элемента из массива
Array.find() — найти элемент по условию
Данный метод callback
и thisArg
в качестве аргументов и возвращает первое найденное значение.
Callback принимает несколько аргументов:
item — текущий элемент массива
index — индекс текущего элемента
currentArray — итерируемый массив
Пример использования:
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
const apple = arr.find(item => item === 'Apple');
console.log(apple); // Apple
Данный метод полезен тем, что мы можем найти и получить сразу и искомый элемент, и его index
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
let indexOfEl;
const apple = arr.find((item, index) => {
if (item === 'Apple') {
indexOfEl = index;
return item;
}
});
console.log(apple, indexOfEl); // Apple 0
Также работа кода прекратиться как только будет найден нужный элемент и второй элемент (дубликат) не будет найден.
В случае если ничего не найдено будет возвращен undefined
.
Array.findIndex() — найти индекс элемента в массиве
Этот метод похож на метод find()
, но возвращать будет только индекс элемента, который соответствует требованию. В случае, если ничего не найдено, вернет -1
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
const index = arr.findIndex(item => item === 'Apple');
console.log(index); // 0
Ну и по аналогии с предыдущим методом, поиск завершается после первого совпадения.
Поиск всех совпадений в массиве
Метод filter()
кроме всего остального также можно использовать для поиска по массиву. Предыдущие методы останавливаются при первом соответствии поиска, а данный метод пройдется по массиву до конца и найдет все элементы. Но данный метод вернет новый массив, в который войдут все элементы соответствующие условию.
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
const filteredArr = arr.filter(item => item === 'Apple');
console.log(filteredArr); // ['Apple', 'Apple']
console.log(arr); // ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
Как видите из примера выше, первоначальный массив не будет изменен.
Подробнее про метод JS filter() можете прочитать в этом посте.
Для этих же целей можно использовать метод forEach(), который предназначен для перебора по массиву:
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
let indexes = [];
arr.forEach((item, index) => {
if (item === 'Apple') indexes.push(index)
});
console.log(indexes); // [0, 4]
В массив indexes
мы получили индексы найденных элементов, это 0 и 4 элементы. Также в зависимости от вашей необходимости, можно создать объект, где ключом будет индекс, а значением сам элемент:
const arr = ['Apple', 'Orange', 'Lemon', 'Cherry', 'Apple'];
let arrObjMap = {};
arr.forEach((item, index) => {
if (item === 'Apple') {
arrObjMap[index] = item;
}
});
console.log(arrObjMap); // {0: 'Apple', 4: 'Apple'}
Поиск в массиве объектов
Если у вас массив состоит не из примитивных типов данных, а к примеру, каждый элемент это объект со своими свойствами и значениями, тогда можно использовать следующие варианты для получения индекса элемента.
Первый способ. С использованием метода map
для массива
const arr = [
{ name: 'Ben', age: 21 },
{ name: 'Clif', age: 22 },
{ name: 'Eric', age: 18 },
{ name: 'Anna', age: 27 },
];
const index = arr.map(item => item.name).indexOf('Anna');
console.log(index); //3
console.log(arr[index]); // {name: 'Anna', age: 27}
В данном случае по массиву arr мы проходим и на каждой итерации из текущего элемента (а это объект со свойствами name
и age
) возвращаем имя человека в новый массив и сразу же выполняем поиск по новому массиву на имя Anna. При совпадении нам будет возвращен индекс искомого элемента в массиве.
Второй способ. Данный вариант будет немного проще, т.к. мы можем сразу получить индекс при совпадении:
const index = arr.findIndex(item => item.name === 'Anna');
console.log(index); //3
console.log(arr[index]); // {name: 'Anna', age: 27}
Заключение
Как видите любой из вышеприведенных методов можно использовать для поиска по массиву. Какой из них использовать зависит от вашей задачи и того, что вам нужно получить — сам элемент или его индекс в массиве, найти только первое совпадение или все совпадения при поиске.