Дополнительно
Как объединить два массива в JavaScript и удалить дубликаты
У меня есть два массива JavaScript:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
Я хочу, чтобы вывод был:
var array3 = ["Vijendra","Singh","Shakya"];
Выходной массив должен удалить повторные слова.
Как объединить два массива в JavaScript, чтобы я получал только уникальные элементы из каждого массива в том же порядке, в который они были вставлены в исходные массивы?
1246
50
Просто объединить массивы (без удаления дубликатов)
Версия ES5 использует
Array.concat
:& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
& Лт;!- конец фрагмента - >
ES6 версия использует [деструктурирование][2]
Поскольку нет «встроенного» способа удаления дубликатов ([ECMA-262][1] на самом деле имеет «Array.forEach», что было бы здорово для этого), мы должны сделать это вручную:
С Underscore.js или Lo-Dash вы можете сделать:
& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
& Лт;!- язык: lang-html - >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"> < / script >& Лт;!- конец фрагмента - >
Http://underscorejs.org/#union
http://lodash.com/docs#union
Сначала объедините два массива, затем отфильтруйте только уникальные элементы:
& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
& Лт;!- конец фрагмента - >
Редактировать
Как было предложено, более разумным решением было бы отфильтровать уникальные элементы в
b
перед объединением сa
:& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
& Лт;!- конец фрагмента - >
Это решение ECMAScript & nbsp; 6 с использованием [оператора спред][1] и дженериков массива.
В настоящее время он работает только с Firefox и, возможно, с Internet & nbsp; Explorer Technical Preview.
Но если вы используете Babel, вы можете получить его сейчас.
[1]: http://kangax.github.io/compat-table/es6/#spread_%28...% 29_operator
ES6
ИЛИ
ИЛИ
С помощью установка (в ECMAScript 2015), это будет так просто:
Вот немного другой взгляд на петлю. С некоторыми оптимизациями в последней версии Chrome, это самый быстрый метод для разрешения объединения двух массивов (Chrome 38.0.2111).
http://jsperf.com/merge-two-rrays-keeping-only-unique-values
цикл while: ~ 589k ops / s < br / > фильтр: ~ 445k операций / с < br / > lodash: 308k операций / с < br / > для петель: 225 КБ опс / с
В комментарии указывалось, что одна из моих переменных настройки заставляла мой цикл опережать остальных, потому что ему не нужно было инициализировать пустой массив для записи. Я согласен с этим, поэтому я переписал тест даже на игровое поле и включил еще более быстрый вариант.
http://jsperf.com/merge-two-rrays-keeping-only-unique-values/52
В этом альтернативном решении я объединил решение ассоциативного массива одного ответа, чтобы устранить вызов
.indexOf ()
в цикле, который сильно замедлял ход событий со вторым циклом, и включил некоторые другие оптимизации, которые имеют другие пользователи. предложил в своих ответах также.Верхний ответ здесь с двойным циклом на каждом значении (i-1) все еще значительно медленнее. Лодаш все еще сильна, и я все равно рекомендую его всем, кто не против добавить библиотеку в свой проект. Для тех, кто не хочет, мой цикл while по-прежнему является хорошим ответом, и ответ фильтра имеет очень сильный показ здесь, выбивая все мои тесты с последним Canary Chrome (44.0.2360) на момент написания этой статьи.
Проверьте ответ Майка и ответ Дэна Стокера, если вы хотите увеличить его на ступеньку выше. Это, безусловно, самый быстрый из всех результатов после прохождения почти всех жизнеспособных ответов.
Вы можете сделать это просто с ECMAScript & nbsp; 6,
Решение, основанное на ES6 Союза
в
в
объединить два массива и удалить дубликат в es6
Просто держитесь подальше от вложенных циклов (O (n ^ 2)) и
.indexOf ()
(+ O (n)).Гораздо лучшая функция слияния массива.
Просто бросаю мои два цента.
Этот метод я часто использую, он использует объект в качестве таблицы хеш-смотров для проверки дубликатов. Предполагая, что хеш - O (1), он запускается в O (n), где n - a.length + b.length. Я, честно говоря, понятия не имею, как браузер выполняет хеш, но он хорошо работает на многих тысячах точек данных.
Почему бы вам не использовать объект? Похоже, вы пытаетесь смоделировать набор. Это не сохранит порядок, однако.
Итак, здесь'с демонстрацией для вашего сценария
в
в
Лучшее решение...
Вы можете проверить прямо в консоли браузера, нажав...
Без дубликата
С дубликатом
Если вы хотите без дубликата, вы можете попробовать лучшее решение отсюда - Код крика.
Попробуйте на консоли браузера Chrome
Вывод:
Упрощен ответ Симо и превратил его в хорошую функцию.
Мои полтора копейки:
Вы можете достичь этого просто, используя Underscore.js's = > uniq :
Он напечатает ["Виджендра", "Сингх", "Шакья"] .
Новое решение (в котором используются
Array.prototype.indexOf
иArray.prototype.concat
):