Как проверить наличие элемента в массиве js
Перейти к содержимому

Как проверить наличие элемента в массиве js

  • автор:

Array.prototype.some()

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015 .

Метод some() проверяет, удовлетворяет ли какой-либо элемент массива условию, заданному в передаваемой функции.

Примечание: метод возвращает false при любом условии для пустого массива.

Интерактивный пример

Синтаксис

arr.some(callback(element[, index[, array]])[, thisArg])

Параметры

Функция проверки каждого элемента, принимает три аргумента:

Текущий обрабатываемый элемент массива.

Индекс текущего обрабатываемого элемента массива.

Массив, по которому осуществляется проход.

Значение, используемое в качестве this при выполнении функции callback .

Возвращаемое значение

true , если функция проверки возвращает truthy значение хотя бы для одного элемента массива. Иначе, false .

Описание

Метод some() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве до тех пор, пока не найдёт такой, для которого callback вернёт истинное значение (значение, становящееся равным true при приведении его к типу Boolean ). Если такой элемент найден, метод some() немедленно вернёт true . В противном случае, если callback вернёт false для всех элементов массива, метод some() вернёт false . Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались.

Функция callback вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.

Если в метод some() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this , видимого из функции.

Метод some() не изменяет массив, для которого он был вызван.

Диапазон элементов, обрабатываемых методом some() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода some() , не будут посещены функцией callback . Если существующие элементы массива изменятся, значения, переданные в функцию callback , будут значениями на тот момент времени, когда метод some() посетит их; удалённые элементы посещены не будут.

Примеры

Проверка значений элементов массива

Следующий пример проверяет наличие в массиве элемента, который больше 10.

function isBiggerThan10(element, index, array)  return element > 10; > [2, 5, 8, 1, 4].some(isBiggerThan10); // false [12, 5, 8, 1, 4].some(isBiggerThan10); // true 

Проверка элементов массива с использованием стрелочных функций

Стрелочные функции предоставляют более краткий синтаксис для подобных проверок.

[2, 5, 8, 1, 4].some((elem) => elem > 10); // false [12, 5, 8, 1, 4].some((elem) => elem > 10); // true 

Проверка наличия элемента в массиве

Чтобы имитировать функцию метода includes() , эта пользовательская функция возвращает true, если элемент существует в массиве:

const fruits = ["apple", "banana", "mango", "guava"]; function checkAvailability(arr, val)  return arr.some(function (arrVal)  return val === arrVal; >); > checkAvailability(fruits, "kela"); // false checkAvailability(fruits, "banana"); // true 

Проверка наличия элемента в массиве с использованием стрелочной функции

const fruits = ["apple", "banana", "mango", "guava"]; function checkAvailability(arr, val)  return arr.some((arrVal) => val === arrVal); > checkAvailability(fruits, "kela"); // false checkAvailability(fruits, "banana"); // true 

Приведение значения к логическому типу

const TRUTHY_VALUES = [true, "true", 1]; function getBoolean(value)  "use strict"; if (typeof value === "string")  value = value.toLowerCase().trim(); > return TRUTHY_VALUES.some(function (t)  return t === value; >); > getBoolean(false); // false getBoolean("false"); // false getBoolean(1); // true getBoolean("true"); // true 

Полифил

Метод some() был добавлен к стандарту ECMA-262 в 5-м издании; поэтому он может не присутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать some() в реализациях, которые не поддерживают этот метод. Этот алгоритм является точно тем, что описан в ECMA-262 5-го издания; и предполагает, что Object и TypeError имеют свои первоначальные значения и что callback.call вычисляется в оригинальное значение Function.prototype.call() .

// Шаги алгоритма ECMA-262, 5-е издание, 15.4.4.17 // Ссылка (en): http://es5.github.io/#x15.4.4.17 // Ссылка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.17 if (!Array.prototype.some)  Array.prototype.some = function (fun /*, thisArg*/)  "use strict"; if (this == null)  throw new TypeError("Array.prototype.some called on null or undefined"); > if (typeof fun !== "function")  throw new TypeError(); > var t = Object(this); var len = t.length >>> 0; var thisArg = arguments.length >= 2 ? arguments[1] : void 0; for (var i = 0; i  len; i++)  if (i in t && fun.call(thisArg, t[i], i, t))  return true; > > return false; >; > 

Спецификации

Specification
ECMAScript Language Specification
# sec-array.prototype.some

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Array.prototype.forEach()
  • Array.prototype.every()
  • Array.prototype.find()
  • TypedArray.prototype.some() (en-US)

Array.prototype.includes()

This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2015 .

Метод includes() определяет, содержит ли массив определённый элемент, возвращая в зависимости от этого true или false .

Интерактивный пример

Синтаксис

arr.includes(searchElement[fromIndex = 0])

Параметры

Позиция в массиве, с которой начинать поиск элемента searchElement . При отрицательных значениях поиск производится начиная с индекса array.length + fromIndex по возрастанию. Значение по умолчанию равно 0.

Возвращаемое значение

Примеры

[1, 2, 3].includes(2); // true [1, 2, 3].includes(4); // false [1, 2, 3].includes(3, 3); // false [1, 2, 3].includes(3, -1); // true [1, 2, NaN].includes(NaN); // true 

fromIndex больше или равен длине массива

Если fromIndex больше или равен длине массива, то возвращается false . При этом поиск не производится.

var arr = ["a", "b", "c"]; arr.includes("c", 3); // false arr.includes("c", 100); // false 

Вычисленный индекс меньше нуля 0

Если fromIndex отрицательный, то вычисляется индекс, начиная с которого будет производиться поиск элемента searchElement . Если вычисленный индекс меньше нуля, то поиск будет производиться во всём массиве.

// длина массива равна 3 // fromIndex равен -100 // вычисленный индекс равен 3 + (-100) = -97 var arr = ["a", "b", "c"]; arr.includes("a", -100); // true arr.includes("b", -100); // true arr.includes("c", -100); // true 

Использование includes() в качестве общих метода

includes() специально сделан общим. Он не требует, чтобы this являлся массивом, так что он может быть применён к другим типам объектов (например, к массивоподобным объектам). Пример ниже показывает использование метода includes() на объекте arguments.

(function ()  console.log([].includes.call(arguments, "a")); // true console.log([].includes.call(arguments, "d")); // false >)("a", "b", "c"); 

Полифил

// https://tc39.github.io/ecma262/#sec-array.prototype.includes if (!Array.prototype.includes)  Object.defineProperty(Array.prototype, "includes",  value: function (searchElement, fromIndex)  if (this == null)  throw new TypeError('"this" is null or not defined'); > // 1. Let O be ? ToObject(this value). var o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0; // 3. If len is 0, return false. if (len === 0)  return false; > // 4. Let n be ? ToInteger(fromIndex). // (If fromIndex is undefined, this step produces the value 0.) var n = fromIndex | 0; // 5. If n ≥ 0, then // a. Let k be n. // 6. Else n < 0,// a. Let k be len + n. // b. If k < 0, let k be 0.var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); function sameValueZero(x, y)  return ( x === y || (typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y)) ); > // 7. Repeat, while k < lenwhile (k  len)  // a. Let elementK be the result of ? Get(O, ! ToString(k)). // b. If SameValueZero(searchElement, elementK) is true, return true. if (sameValueZero(o[k], searchElement))  return true; > // c. Increase k by 1. k++; > // 8. Return false return false; >, >); > 

Если требуется поддержка устаревших движков JavaScript, которые не поддерживают Object.defineProperty , то наилучшим решением будет вообще не делать полифил для методов Array.prototype , так как не получится сделать их неперечисляемыми.

Спецификации

Specification
ECMAScript Language Specification
# sec-array.prototype.includes

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • TypedArray.prototype.includes() (en-US)
  • String.prototype.includes()
  • Array.prototype.indexOf()
  • Array.prototype.find()
  • Array.prototype.findIndex()

Как узнать, есть ли элемент в массиве?

Есть массив: [‘dog’, ‘cat’, ‘hamster’, ‘bird’, ‘fish’] , нужно вывести в консоль true , если массив содержит dog и false — если такой элемент отсутствует, но насколько я понимаю доступ к элементу в массиве проходит по номеру array[..] , каким образом можно проверить наличие того или иного элемента?

Отслеживать
13.8k 12 12 золотых знаков 44 44 серебряных знака 77 77 бронзовых знаков
задан 10 ноя 2015 в 22:21
363 2 2 золотых знака 4 4 серебряных знака 8 8 бронзовых знаков
– user176262
10 ноя 2015 в 22:28

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Маленькая интродукция

Задача поиска элемента в массиве стоит перед всеми достаточно часто и хорошо бы расписать, как это можно сделать.

Ищут обычно в массиве элементы типа Number , String или Object . Естественно, самый быстрый способ поиска — по элементам типа Number , сравнение числа, даже очень большого, происходит очень быстро, гораздо проще проверить один элемент, чем лексиграфически сравнивать строки, а с объектами вообще другая история. Если мы ищем именно тот объект, который мы добавили в массив, то есть сравниваем ссылки — это так же быстро, как и сравнивать числа, а вот если же надо искать по свойствам объекта, то это может весьма и весьма затянуться. В особо сложных случаях, советую составлять какой-нибудь хэш объекта и строить отдельным массив-карту, в которой уже спокойно искать всё, что надо найти.

Разберем 6 способов сделать это на нативном JS разной новизны и 3 способа с их разбором на популярных фреймворках: jQuery, underscore и lodash.

Часть первая, нативная, в стиле аллегро

Для начала надо пройтись по родным возможностям языка и посмотреть, что можно сделать самим.

Поиск в лоб

Попробуем просто идти по элементам массива, пока мы не встретим то, что нам нужно. Как всегда самое простое решение является в среднем самым быстрым.

function contains(arr, elem) < for (var i = 0; i < arr.length; i++) < if (arr[i] === elem) < return true; >> return false; > 

Работает везде. Сравнивает строго, с помощью === . Легко можно заменить на == , бывает полезно, когда элементы массива разных типов, но может замедлить поиск. Его можно и модифицировать, добавив возможность начинать поиск элемента с конца. Шикарно ищет цифры, строки. Немного расширив, можно добавить возможность поиска элемента по своему условию (это поможет нам искать по свойствам объекта или, например, первый элемент, который больше 100500):

function contains(arr, pred) < for (var i = 0; i < arr.length; i++) < if (typeof pred == 'function' && pred(arr[i], i, arr) || arr[i] === elem) < return true; >> return false; > 

Array.prototype.indexOf()

Array.prototype.indexOf(searchElement[, fromIndex = 0]) — старый добрый метод, заставляющий всех мучиться со своей -1 в случае, когда элемента нет.

function contains(arr, elem)
function contains(arr, elem, from)

Array.prototype.lastIndexOf()

Array.prototype.lastIndexOf(searchElement[, fromIndex = arr.length — 1]) — справедливости ради надо рассказать и про него. Работает полностью аналогично Array.prototype.indexOf() , но только полностью наоборот (поиск идет в обратном порядке и fromIndex изначально отсчитывается с конца). Заменил конструкцию ret != -1 на !!~ret ради забавы.

function contains(arr, elem, from)

Array.prototype.find()

Array.prototype.find(callback[, thisArg]) — модный стильный и молодежный ES6, со всеми вытекающими:

function contains(arr, elem) < return arr.find((i) =>i === elem) != -1; > 

Возвращает элемент или -1 , если ничего не найдено. Ищет с помощью callback(elem, index, arr) , то есть, если эта функция вернет true , то это именно тот самый, искомый элемент. Конечно, эту функцию можно задавать самому, поэтому метод универсален.

Array.prototype.findIndex()

Array.prototype.findIndex(callback[, thisArg]) — полностью аналогичный предыдущему метод, за исключением того, что функция возвращает не элемент, а индекс. Забавы ради сделаю её с возможностью передать свою функцию:

function contains(arr, pred) < var f = typeof pred == 'function' ? pred : ( i =>i === pred ); return arr.findIndex(f) != -1; > 

Array.prototype.includes()

Array.prototype.includes(searchElement[, fromIndex]) — а это уже ES7, с ещё пока оочень сырой поддержкой. Наконец-то у нас будет специальный метод, чтобы узнать, есть ли элемент в массиве! Поздравляю!

arr.includes(elem); 

Это всё, что нужно, чтобы найти элемент. Аргументы у этой функции полностью аналогичны Array.prototype.indexOf() . А вот вернет он true в случае успеха и false в обратном. Естественно искать по свойствам объектов нельзя, для этого есть Array.prototype.find() . Должен быть самым быстрым, но. Возможно, что он и станет со временем самым быстрым.

Часть вторая, со вниманием, но чужая и в стиле сонаты

Теперь, наконец, можно поговорить об этой же теме, но в контексте парочки фреймворков! Говорят, что всегда хорошо посмотреть сначала, как делают другие, перед тем, как начнешь делать это сам. Может это откроет нам глаза на что-нибудь интересное!

jQuery

jQuery.inArray(value, array [, fromIndex ]) — между прочим весьма быстрый метод, по тестам.

Использует внутри строгое равенство === и возвращает -1 , если ничего не нашел, а если все таки нашёл, то вернет его индекс. Для удобства и одинаковости обернем её в функцию:

function contains(arr, elem)

А теперь поговорим, как она работает. Вот, что она представляет из себя в версии 2.1.3 :

inArray: function( elem, arr, i )

Где indexOf это вот это:

// Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) < var i = 0, len = list.length; for ( ; i < len; i++ ) < if ( list[i] === elem ) < return i; >> return -1; > 

Забавный комментарий говорит, что так быстрее, чем родной Array.prototype.indexOf() (могу предположить, что из-за отсутствия всех проверок) и предлагает посмотреть тесты производительности.

По сути — это самый первый способ из первой части.

Underscore

_.contains(list, value) — вот такой метод предлагает нам популярная библиотека для работы с коллекциями. То же самое, что и _.include(list, value) .

Использует === для сравнения. Вернёт true , если в list содержится элемент, который мы ищем. Если list является массивом, будет вызван метод indexOf.

_.contains = _.include = function(obj, target) < if (obj == null) return false; if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; return any(obj, function(value) < return value === target; >); >; 

Где nativeIndexOf — штука, которая говорит, что Array.prototype.indexOf() существует, а obj.indexOf === nativeIndexOf говорит, что list — массив. Теперь понятно, почему этот метод медленнее, чем jQuery.inArray() , просто обертка над Array.prototype.indexOf() . Ничего интересного.

Lodash

_.includes(collection, target, [fromIndex=0]) — вот последняя надежда на новые мысли, от второй знаменитейшей библиотеки для работы с коллекциями. То же самое, что _.contains() и _.include() .

Возвращает true , если содержит и false если нет. fromIndex индекс элемента, с которого начинаем поиск.

function includes(collection, target, fromIndex, guard) < var length = collection ? getLength(collection) : 0; if (!isLength(length)) < collection = values(collection); length = collection.length; >if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) < fromIndex = 0; >else < fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); >return (typeof collection == 'string' || !isArray(collection) && isString(collection)) ? (fromIndex -1) : (!!length && getIndexOf(collection, target, fromIndex) > -1); > 

guard — служебный аргумент. Сначала находится длина коллекции, выбирается fromIndex , а потом. нет, не Array.prototype.indexOf() ! Для поиска в строке используется String.prototype.indexOf() , а мы идем дальше в _.getIndexOf() и в результате попадём в ло-дашскую имплементацию indexOf() :

function indexOf(array, value, fromIndex) < var length = array ? array.length : 0; if (!length) < return -1; >if (typeof fromIndex == 'number') < fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; >else if (fromIndex) < var index = binaryIndex(array, value); if (index < length && (value === value ? (value === array[index]) : (array[index] !== array[index]))) < return index; >return -1; > return baseIndexOf(array, value, fromIndex || 0); > 

Она интересна тем, что fromIndex может принимать значения как Number , так и Boolean и если это всё таки значение булевого типа и оно равно true , то функция будет использовать бинарный поиск по массиву! Прикольно. Иначе же выполнится indexOf() попроще:

function baseIndexOf(array, value, fromIndex) < if (value !== value) < return indexOfNaN(array, fromIndex); >var index = fromIndex - 1, length = array.length; while (++index < length) < if (array[index] === value) < return index; >> return -1; > 

Интересный ход для случая, когда мы ищем NaN (напомню, что из-за досадной ошибки он не равен сам себе). Выполнится indexOfNaN() , и действительно ни один из всех способов описанных ранее не смог бы найти NaN , кроме тех, естественно, где мы могли сами указать функцию для отбора элементов.

Можно предложить просто обернуть _.indexOf() для поиска элемента:

function contains(arr, elem, fromIndex)

Где fromIndex будет либо индексом откуда начинаем искать, либо true , если мы знаем, что arr отсортирован.

Заключение, хотя и в стиле интермеццо

И да, все эти варианты имеют смысл, только если момент с поиском данных част в вашем алгоритме или поиск происходит на очень больших данных. Вот приведу ниже несколько тестов на поиск элементов типа Number и String в массивах длинной 1000000 (миллион) элементов для трех случаев, когда элемент находится вначале массива, в середине (можно считать за среднюю по палете ситуацию) и в конце (можно считать за время поиска отсутствующего элемента, кроме метода с Array.prototype.lastIndexOf() ).

  1. Number , 1000000 элементов, искомый элемент в начале;
  2. Number , 1000000 элементов, искомый элемент в середине;
  3. Number , 1000000 элементов, искомый элемент в конце;
  4. String , 1000000 элементов, искомый элемент в начале;
  5. String , 1000000 элементов, искомый элемент в середине;
  6. String , 1000000 элементов, искомый элемент в конце.

Результаты тестов могут сильно зависеть от версии браузера, да и от самих браузеров, как этого избежать не знаю, но рекомендую протестить на нескольких.

Видно, что в среднем везде выигрывает первый способ из первой части (написанный собственноручно), а второе место обычно делят lоdash и Array.prototype.includes() .

Да, прошу заметить, что если взбредёт в голову искать NaN , то это может не получиться почти во всех методах, так как NaN !== NaN .

Поиск элементов в массиве JavaScript

Для поиска по массиву в 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); //

Поиск в массиве объектов

Если у вас массив состоит не из примитивных типов данных, а к примеру, каждый элемент это объект со своими свойствами и значениями, тогда можно использовать следующие варианты для получения индекса элемента.

Первый способ. С использованием метода 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]); //

В данном случае по массиву arr мы проходим и на каждой итерации из текущего элемента (а это объект со свойствами name и age ) возвращаем имя человека в новый массив и сразу же выполняем поиск по новому массиву на имя Anna. При совпадении нам будет возвращен индекс искомого элемента в массиве.

Второй способ. Данный вариант будет немного проще, т.к. мы можем сразу получить индекс при совпадении:

const index = arr.findIndex(item => item.name === 'Anna'); console.log(index); //3 console.log(arr[index]); //

Заключение

Как видите любой из вышеприведенных методов можно использовать для поиска по массиву. Какой из них использовать зависит от вашей задачи и того, что вам нужно получить — сам элемент или его индекс в массиве, найти только первое совпадение или все совпадения при поиске.

Ваши вопросы и комментарии:

Добавить комментарий Отменить ответ

Свежие записи

  • MySQL IS NULL — проверка поля на NULL
  • MySQL LIKE — поиск по паттерну
  • Between MySQL — оператор для выборки по диапазону значений
  • MySQL IN и NOT IN — несколько условий
  • MySQL WHERE — синтаксис и примеры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *