Использование метода javascript .every для определения наличия повторяющихся элементов в заданном массиве.
Я не буду вдаваться в подробности о том, как работает этот метод, есть и другие статьи среднего уровня, в которых он подробно рассматривается. Здесь мы сосредоточимся на этом конкретном случае использования. Но сначала мы начнем с быстрого официального определения .every в MDN:
Метод
every()
проверяет, все ли элементы массива проходят тест, реализованный предоставленной функцией. Он возвращает логическое значение.
Синтаксис:
arr.every(callback(element[, index[, array]])[, thisArg])
В этом случае нам нужно использовать только arr.every(callback(element)). Хотя, как вы можете видеть выше, метод принимает два дополнительных аргумента.
Простой пример использования метода:
let words = [“hello”, “goodbye”, “goodmorning”]; const everyLength = words.every(function (w) { return w.length > 4; }); //everyLength //true
Каждый элемент в массиве слов имеет длину больше 4, поэтому метод возвращает значение true.
Теперь, как мы можем использовать его для поиска повторяющихся значений в заданном массиве? Хорошо, давайте перефразируем вопрос: как мы можем гарантировать, что первое вхождение элемента массива является последним? К счастью, есть два связанных метода Javascript, которые проверяют эти два условия: .indexOf() и .lastIndexOf().
Из МДН:
Метод indexOf() возвращает в вызывающем объекте String индекс первого вхождения указанного значения. Метод lastIndexOf() возвращает индекс в вызывающем объекте String последнего вхождения указанного значения
Мы можем использовать .every вместе с этими двумя методами в логическом (истинном или ложном) виде, чтобы достичь нашей цели проверки на наличие повторяющихся элементов массива.
function hasNoDuplicates(arr){ return arr.every(function(val){ return arr.indexOf(val) === arr.lastIndexOf(val); }); }
Мы проверяем (возвращаем true), является ли каждое значение(val)в заданном массиве(arr) first(indexOf)и последний(lastIndexOf). Если нет, функция вернет false.
используя наш массив слов сверху:
let words = [“hello”, “goodbye”, “goodmorning”]; hasNoDuplicates(words) true
Теперь давайте добавим еще одно «привет»
let words2 = ["hello", "goodbye", "goodmorning", "hello"]; hasNoDuplicates(words2) false
Вот и все, быстрая проверка «да» или «нет» на наличие повторяющихся значений в данном массиве.