Как объединить два массива в JavaScript и удалить дубликаты?
Я имею две массива JavaScript:
var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
Мне нужно получить следующий вывод:
var array3 = ["Vijendra", "Singh", "Shakya"];
Массив на выходе должен содержать уникальные элементы без повторений.
Как мне объединить два массива в JavaScript так, чтобы в результате остались только уникальные элементы в том порядке, в котором они были вставлены в оригинальные массивы?
5 ответ(ов)
С помощью Underscore.js или Lo-Dash вы можете выполнить объединение массивов, используя метод _.union
. Вот пример кода:
console.log(_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]));
Это выведет объединение уникальных значений из указанных массивов.
Для использования библиотеки Lo-Dash в вашем проекте, добавьте следующий скрипт в HTML-файл:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
Дополнительные сведения о методе union
вы можете найти в документации:
- Для Underscore.js: documentation
- Для Lo-Dash: documentation
Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь спрашивать!
Если вы хотите объединить два массива array1
и array2
, при этом не удаляя дубликаты, это можно сделать с помощью операторов расширения (spread operator):
const result = [...array1, ...array2]; // => дубликаты не удаляются
Если же вы хотите объединить два массива и одновременно удалить дубликаты, вы можете использовать Set
следующим образом:
const result = [...new Set([...array1, ...array2])]; // => дубликаты удаляются
Таким образом, в первом случае вы просто объединяете массивы, а во втором — убираете повторяющиеся элементы.
Чтобы объединить два массива и оставить только уникальные элементы, сначала необходимо объединить массивы, а затем отфильтровать уникальные значения:
var a = [1, 2, 3], b = [101, 2, 1, 10];
var c = a.concat(b);
var d = c.filter((item, pos) => c.indexOf(item) === pos);
console.log(d); // d будет [1, 2, 3, 101, 10]
Редактирование
Как было предложено, более производительным решением будет отфильтровать уникальные элементы в массиве b
, прежде чем объединять его с a
:
var a = [1, 2, 3], b = [101, 2, 1, 10];
var c = a.concat(b.filter((item) => a.indexOf(item) < 0));
console.log(c); // c будет [1, 2, 3, 101, 10]
Таким образом, мы сначала отбираем только те элементы из массива b
, которые не присутствуют в массиве a
, и затем объединяем их. Это позволяет избежать дублирования и улучшает производительность.
В ES6 предложено однострочное решение для объединения нескольких массивов без дубликатов, используя деструктуризацию и Set.
Вот пример кода:
const array1 = ['a','b','c'];
const array2 = ['c','c','d','e'];
const array3 = [...new Set([...array1,...array2])];
console.log(array3); // ["a", "b", "c", "d", "e"]
В этом примере мы сначала объединяем массивы array1
и array2
с помощью оператора расширения (...
). Затем создаем экземпляр Set
, который автоматически удаляет дубликаты. Наконец, мы снова используем оператор расширения для преобразования Set
обратно в массив. Таким образом, в результате мы получаем массив без дубликатов.
Я понимаю, что этот вопрос не касается массива объектов, но поисковые системы всё равно могут привести сюда.
Поэтому стоит добавить для будущих читателей правильный способ на ES6 для слияния массивов и удаления дубликатов.
Массив объектов:
var arr1 = [ {a: 1}, {a: 2}, {a: 3} ];
var arr2 = [ {a: 1}, {a: 2}, {a: 4} ];
var arr3 = arr1.concat(arr2.filter( ({a}) => !arr1.find(f => f.a === a)));
// [ {a: 1}, {a: 2}, {a: 3}, {a: 4} ]
В данном примере мы сначала используем filter
для второго массива, чтобы оставить только те объекты, которые отсутствуют в первом массиве. Затем с помощью concat
соединяем оба массива, что позволяет получить новый массив без дубликатов.
Слияние/выпрямление массива массивов
Как перемешать (сделать случайным) массив в JavaScript?
Как очистить массив в JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?