Проверка присутствия элемента в массиве
Описание проблемы
Я использую следующую функцию для проверки, содержится ли значение в массиве:
function inArray(needle, haystack) {
var count = haystack.length;
for (var i = 0; i < count; i++) {
if (haystack[i] === needle) {
return true;
}
}
return false;
}
Функция работает, но я хотел бы узнать, есть ли более эффективный или современный способ выполнения этой задачи в JavaScript. Было бы здорово получить рекомендации по улучшению этого кода.
3 ответ(ов)
В вашем коде !!(arr.indexOf("val")+1)
используется для проверки, содержится ли значение "val"
в массиве arr
. Этот код возвращает true
, если значение найдено (индекс будет >= 0), и false
, если значение не найдено.
Функция indexOf
возвращает индекс элемента в массиве, если он существует, и -1
, если нет. При добавлении 1
к индексу, вы получаете 0
, если элемент не найден (что преобразуется в false
), и значение больше 0
, если элемент найден (что преобразуется в true
). Двойное отрицание !!
приводит к приведению к булевому типу данных.
Однако, стоит отметить, что код будет ошибочно возвращать false
для первого элемента, если он равен "val"
(так как indexOf
для первого элемента возвращает 0
, и 0 + 1
даст 1
, что для !!
даёт true
). Чтобы исправить это, можно убрать +1
и просто использовать arr.includes("val")
, который более интуитивно понятен:
arr.includes("val")
Таким образом, окончательный код, который корректно проверяет наличие элемента, будет таким:
arr.includes("val")
Вы можете использовать метод indexOf
, однако он может работать некорректно в последней версии Internet Explorer.
Код:
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
Пример выполнения:
isInArray(1, [1, 2, 3]); // true
Я рекомендую использовать следующий код:
function inArray(needle, haystack) {
var length = haystack.length;
for (var i = 0; i < length; i++) {
if (haystack[i] == needle) {
return true;
}
}
return false;
}
Этот вариант работает более надежно и будет совместим с более старыми версиями браузеров.
С момента появления ECMAScript 6, вы можете использовать Set
для работы с уникальными значениями. Вот пример использования:
var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
В данном примере мы создаем массив myArray
, затем инициализируем Set
на основе этого массива. Метод .has()
позволяет проверить, содержит ли набор (set) конкретное значение. В данном случае hasB
будет истинным (true), так как 'B' присутствует в Set
, а hasZ
ложно (false), так как 'Z' отсутствует.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?
Как проверить, пустой ли массив или он не существует?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'