Как я могу получить список уникальных значений в массиве? Всегда ли мне нужно использовать второй массив или в JavaScript есть что-то похожее на hashmap в java?
Я собираюсь использовать только JavaScript и jQuery . Никакие дополнительные библиотеки не могут быть использованы.
javascript
jquery
астронавт
источник
источник
underscore.js
библиотеки?list.toSet
Ответы:
Поскольку я рассказал об этом в комментариях к ответу @ Rocket, я также могу привести пример, в котором не используются библиотеки. Это требует двух новых функций прототипа,
contains
иunique
Для большей надежности вы можете заменить
contains
наindexOf
прокладку MDN и проверить,indexOf
равен ли каждый элемент -1: документацияисточник
~a.indexOf(b) === (a.indexOf(b) == -1)
if (~a.indexOf(b)) ...
является идентичным для написания большеif (a.indexOf(b) == -1) ...
.Или для тех, кто ищет однострочник (простой и функциональный), совместимый с современными браузерами :
Обновление 18-04-2017
Похоже, что Array.prototype.includes теперь широко поддерживается в последних версиях основных браузеров ( совместимость )
Обновление 29-07-2015:
В планах браузеров работа по поддержке стандартного метода Array.prototype.include, который, хотя и не дает прямого ответа на этот вопрос; часто связано.
Использование:
Pollyfill ( поддержка браузера , источник из Mozilla ):
источник
Вот гораздо более чистое решение для ES6, которое, как я вижу, здесь не включено. Он использует Set и оператор распространения :
...
Который возвращается
[1, 2]
источник
Array.from(... new Set(a))
так как Set не может быть неявно преобразован в тип массива. Просто на голову!Array.from(new Set(a))
? Это похоже на работу.Один лайнер, чистый JavaScript
С синтаксисом ES6
list = list.filter((x, i, a) => a.indexOf(x) === i)
С синтаксисом ES5
Совместимость браузера : IE9 +
источник
a.indexOf(x) === i
примечание равенства с тремя знаками равенства.Используя EcmaScript 2016, вы можете просто сделать это следующим образом.
Наборы всегда уникальны, и с помощью них
Array.from()
вы можете конвертировать набор в массив. Для справки взгляните на документацию.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Устанавливать
источник
indexOf()
ответы ужасны, потому что они O (N ^ 2). Распространенные ответы в порядке, но не будут работать для больших массивов. Это лучший подход.Теперь в ES6 мы можем использовать недавно введенную функцию ES6
ИЛИ с помощью Array распространяет синтаксис на итерируемые
Это вернет уникальный результат.
источник
new Set
подобное (например, современный Angular / TypeScript)let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2];
let uniqueItems = [...new Set(items)];
Если вы хотите оставить исходный массив без изменений,
вам нужен второй массив для хранения уникальных элементов первого
Большинство браузеров имеют
Array.prototype.filter
:источник
В наши дни вы можете использовать тип данных Set для ES6, чтобы преобразовать ваш массив в уникальный набор. Затем, если вам нужно использовать методы массива, вы можете превратить его обратно в массив:
источник
var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Не родной в Javascript, но во многих библиотеках есть этот метод.
Underscore.js
_.uniq(array)
( ссылка ) работает довольно хорошо ( источник ).источник
Используя jQuery, вот уникальная функция Array, которую я сделал:
источник
$.uniqueArray(arr)
? Встраивание ссылок на jQuery вArray
прототипе выглядит сомнительным$.uniqueArray
он зависит от jQuery; менее очевидно, чтоArray.prototype.unique
это тоже.prototype
s. Но теперь я понимаю вашу точку зрения. Я все равно оставлю это здесь.Короткое и приятное решение с использованием второго массива;
источник
Быстрый, компактный, без вложенных циклов, работает с любым объектом, а не только со строками и числами, принимает предикат и всего 5 строк кода !!
Пример: чтобы найти уникальные предметы по типу:
Если вы хотите, чтобы он нашел первый уникальный элемент вместо последнего, добавьте туда проверку found.hasOwnPropery ().
источник
Вам нужен только ванильный JS, чтобы найти уникальные с Array.some и Array.reduce. С синтаксисом ES2015 это всего 62 символа.
Array.some и Array.reduce поддерживаются в IE9 + и других браузерах. Просто измените функции жирной стрелки для поддержки обычных функций в браузерах, которые не поддерживают синтаксис ES2015.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Array / Уменьшить
источник
Большинство из приведенных выше решений имеют высокую сложность во время выполнения.
Вот решение, которое использует
reduce
и может выполнить работу за O (n) время.Примечание:
Это решение не зависит от снижения. Идея состоит в том, чтобы создать карту объектов и вставить уникальные в массив.
источник
ES6 способ:
источник
ты можешь использовать,
это даст вам уникальные элементы,
**> но есть подвох,
Второй вариант - использовать метод фильтра в массиве.
источник
Вы можете ввести массив с дубликатами, а метод ниже вернет массив с уникальными элементами.
источник
Единственная проблема с решениями, представленными до сих пор, - это эффективность. Если вас это беспокоит (и вам, вероятно, следует), вам следует избегать вложенных циклов: for * for, filter * indexOf, grep * inArray, они все повторяют массив несколько раз. Вы можете реализовать один цикл с такими решениями, как этот или этот
источник
источник
Я пробовал эту проблему в чистом JS. Я выполнил следующие шаги: 1. Сортировать указанный массив, 2. Перебрать отсортированный массив, 3. Проверить предыдущее значение и следующее значение с текущим значением.
демонстрация
источник
источник
Имея в виду, что
indexOf
он вернет первое вхождение элемента, вы можете сделать что-то вроде этого:источник
Если вам не нужно сильно беспокоиться о старых браузерах, это именно то, для чего предназначены наборы.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
источник
Еще одна мысль по этому вопросу. Вот что я сделал, чтобы добиться этого с меньшим количеством кода.
источник
источник
Вот подход с настраиваемой
equals
функцией, которая может использоваться как для примитивов, так и для пользовательских объектов:использование:
источник
Мой ответ использует
Array.filter
иArray.indexOf
методы, чтобы получить уникальные значенияЯ видел этот подход на веб-сайте, но их код отличается от того, что выглядит здесь. Я упростил код до одной строки и разместил его здесь, чтобы кто-то получил от него пользу
Примечание: мой подход похож на один лайнер, опубликованный Джошем. Я оставляю это здесь, поскольку имена переменных говорят сами за себя в моем коде.
источник
Я просто думал, можем ли мы использовать линейный поиск для устранения дубликатов:
}
HTML:
источник
Вот одно линейное решение проблемы:
Скопируйте и вставьте это в консоль браузера и получите результаты, йо :-)
источник
У меня есть встроенная функция JQuery Unique .
Для получения дополнительной информации вы можете обратиться к документации по jquery API.
http://api.jquery.com/jquery.unique/
источник