Мне нужно проверить массив JavaScript, чтобы увидеть, есть ли какие-либо дубликаты значений. Какой самый простой способ сделать это? Мне просто нужно найти дубликаты значений - мне не нужны их индексы или сколько раз они дублируются.
Я знаю, что могу перебрать массив и проверить все остальные значения на совпадение, но, похоже, должен быть более простой способ.
Подобный вопрос:
javascript
arrays
Скотт Сондерс
источник
источник
Ответы:
Вы можете отсортировать массив, а затем запустить его и посмотреть, совпадает ли следующий (или предыдущий) индекс с текущим. Предполагая, что ваш алгоритм сортировки хорош, это должно быть меньше, чем O (n 2 ):
В случае, если вы хотите вернуть как функцию для дубликатов. Это для аналогичного типа случая.
Ссылка: https://stackoverflow.com/a/57532964/8119511
источник
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Вместо этого они говорят не писатьj = i + +j
. Две разные вещи ИМХО. Я думаю, чтоi += 1
это больше сбивает с толку, чем просто и красивоi++
:)var sorted_arr = arr.sort()
, бесполезно:arr.sort()
изменяет исходный массив (что само по себе является проблемой). Это также отбрасывает элемент. (Запустите приведенный выше код. Что происходит с 9?) Cc @dystroy Более чистое решение будетresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Если вы хотите выявить дубликаты, попробуйте это отличное решение:
Источник: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
источник
Это мой ответ из дубликата темы (!):
При написании этой записи 2014 - все примеры были for-loop или jQuery. Javascript имеет идеальные инструменты для этого: сортировать, отображать и уменьшать.
Найти дубликаты
Более функциональный синтаксис:
@ Дмитрий-Лаптин указал, что какой-то код должен быть удален. Это более компактная версия того же кода. Использование некоторых трюков ES6 и функций высшего порядка:
источник
Найти повторяющиеся значения в массиве
Это должен быть один из самых коротких способов найти дублирующиеся значения в массиве. Как специально запрашивается OP, это не удаляет дубликаты, а находит их .
Это не требует сортировки или каких-либо сторонних рамок. Это также не нуждается в ручных петлях. Он работает с каждым значением indexOf () (или, чтобы быть более понятным: оператор строгого сравнения ).
Из-за lower () и indexOf () ему нужен как минимум IE 9.
источник
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Вы можете добавить эту функцию или настроить ее и добавить в прототип Javascript Array:
источник
ОБНОВЛЕНО: ниже используется оптимизированная комбинированная стратегия. Он оптимизирует поиск примитивов, чтобы получить выгоду от времени поиска в хеше O (1) (
unique
для массива примитивов используется O (n)). Поиск объектов оптимизируется путем тегирования объектов с уникальным идентификатором при выполнении итерации, поэтому идентификация дублированных объектов также составляет O (1) для каждого элемента и O (n) для всего списка. Единственное исключение - элементы, которые заморожены, но они редки, и резерв предоставляется с использованием массива и indexOf.Если у вас есть доступные коллекции ES6, то существует гораздо более простая и значительно более быстрая версия. (шим для IE9 + и других браузеров здесь: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
источник
ОБНОВЛЕНО: Короткий однострочный, чтобы получить дубликаты:
Чтобы получить массив без дубликатов, просто инвертируйте условие:
Я просто не задумывался
filter()
в своем старом ответе ниже;)Когда все, что вам нужно, это проверить, что нет дубликатов, как задано в этом вопросе, вы можете использовать
every()
метод:Обратите внимание, что
every()
не работает для IE 8 и ниже.источник
источник
'a'
в массиве, внутри функции фильтра theindex == 1
, тогда какself.indexOf('a') == 0
Это должно дать вам то, что вы хотите, просто дубликаты.
источник
используя underscore.js
источник
ES2015
Найти уникальные значения из 3-х массивов (или более):
Просто полифил для массива indexOf для старых браузеров:
Решение jQuery с использованием "inArray":
вместо добавления
Array.prototype.indexOf
источник
var r = [];
чтобы ваш код работал. И работал как шарм.r
переменнаяВот мое простое и однострочное решение.
Сначала он ищет не уникальные элементы, а затем делает найденный массив уникальным с помощью Set.
Таким образом, у нас есть массив дубликатов в конце.
источник
Это мое предложение (ES6):
источник
undefined
является дубликатом.или при добавлении в prototyp.chain массива
Смотрите здесь: https://gist.github.com/1305056
источник
i&&
это позволяет избежать выхода за пределы массива, но это также означает, что первый элемент в отсортированном массиве не будет включен. В вашем примере нет1
в результирующем массиве. Т.е.return i&&v!==o[i-1]?v:0;
должно бытьreturn v!==o[i-1];
Быстрый и элегантный способ с использованием деструктурирования и уменьшения объектов es6
Он выполняется в O (n) (1 итерация по массиву) и не повторяет значения, которые появляются более 2 раз
источник
Вот самое простое решение, которое я мог придумать:
Вот и все.
Замечания:
Он работает с любыми номерами , включая
0
, строки и отрицательные числа например-1
- родственный вопрос: Получить все уникальные значения в массиве JavaScript (удаление дубликаты)Исходный массив
arr
сохраняется (filter
возвращает новый массив вместо изменения исходного)filtered
Массив содержит все дубликаты; он также может содержать более 1 одинакового значения (например, наш фильтрованный массив здесь[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Если вы хотите получить только дублирующиеся значения (вы не хотите иметь несколько дубликатов с одним и тем же значением), вы можете использовать
[...new Set(filtered)]
(в ES6 есть объект Set, который может хранить только уникальные значения)Надеюсь это поможет.
источник
Самый короткий ванильный JS :
источник
Вот очень легкий и простой способ:
источник
С ES6 (или с помощью Babel или Typescipt) вы можете просто сделать:
https://es6console.com/j58euhbt/
источник
Простой код с синтаксисом ES6 (возврат отсортированного массива дубликатов):
Как пользоваться:
источник
один лайнер
источник
indx!
для первого примера?indx !== ...
- строгое неравенство.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Этот ответ также может быть полезен, он использует
reduce
оператор / метод js для удаления дубликатов из массива.источник
new Set([1, 2, 2, 3, 3, 3, 3])
чтобы удалить дубликатыСледующая функция (уже упоминавшаяся разновидность функции deleDuplicates), похоже, добилась цели, возвращая test2,1,7,5 для ввода ["test", "test2", "test2", 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Обратите внимание, что проблема в JavaScript более странная, чем в большинстве других языков, поскольку массив JavaScript может содержать практически все. Обратите внимание, что решения, использующие сортировку, могут нуждаться в соответствующей функции сортировки - я еще не пробовал этот маршрут.
Эта конкретная реализация работает для (как минимум) строк и чисел.
источник
Только ES5 (т. Е. Ему необходим polyfill для filter () для IE8 и ниже):
источник
Эта функция избегает шага сортировки и использует метод redu () для отправки дубликатов в новый массив, если он еще не существует в нем.
источник
Это, вероятно, один из самых быстрых способов постоянного удаления дубликатов из массива в 10 раз быстрее, чем большинство функций здесь. И в 78 раз быстрее в сафари.
Если вы не можете прочитать приведенный выше код, спросите, прочитайте книгу по javascript или вот несколько объяснений более короткого кода. https://stackoverflow.com/a/21353032/2450730
РЕДАКТИРОВАТЬ Как указано в комментариях, эта функция возвращает массив с уникальными значениями, однако вопрос требует найти дубликаты. в этом случае простая модификация этой функции позволяет помещать дубликаты в массив, а затем использование предыдущей функции
toUnique
удаляет дубликаты дубликатов.источник
Использование «include» для проверки, если элемент уже существует.
источник
ES6 предлагает структуру данных Set, которая в основном представляет собой массив, который не принимает дубликаты. С помощью структуры данных Set очень легко найти дубликаты в массиве (используя только один цикл).
Вот мой код
источник
Я только что выяснил простой способ добиться этого с помощью фильтра массива
источник
Следующая логика будет проще и быстрее
Преимущества:
Описание логики:
Примечание: методы map () и filter () эффективны и быстрее.
источник