Если вы читаете этот пост, вы можете быть озадачены тем, как так называемые «простые проблемы» могут превратиться в кошмары. Любой, кто работает над JavaScript, знает, что когда-нибудь массивы нужно объединять. Вы обязательно столкнетесь с ситуацией, когда у вас есть два или более массива, которые необходимо объединить. Это тривиальная проблема, у которой есть несколько решений, поэтому давайте рассмотрим три разных способа решения этой проблемы.

Посмотрите мое видео на YouTube, чтобы увидеть живую демонстрацию:

Традиционный цикл «для».

Традиционный метод (и наиболее распространенный метод) включает два или более цикла for в зависимости от количества массивов.

Псевдокод для выполнения циклов и слияния массивов:

Итерировать по каждому элементу в массиве

Проверить, найден ли элемент массива в «merged_array» или нет. Используйте indexOf (), чтобы определить, присутствует ли элемент массива.

Если элемент массива отсутствует, indexOf () вернет «-1». Затем объедините элемент в «merged_array».

если элемент массива присутствует, indexOf () вернет его позицию в «merged_array». Следовательно, ничего не делайте.

Повторите шаги с 1 по 4 для всех объединяемых массивов.

Вычисление временной сложности

Для объединения двух массивов с использованием циклов for временная сложность будет следующей:

Чтобы перебрать массив с n элементами: Big O (n)

Для выполнения метода indexOf: Big O ((n-1) + (n-2) + (n-3) …… + 1): Big O (n)

Для выполнения метода indexOf, «n» раз: Big O (n) * n: Big O (n²)

Общая временная сложность: Big O (n²)

Код

let array1 = ['a','b','c']
let array2 = ['c','c','d','e'];
let array3 = [];
for(let i=0;i<array1.length;i++){
  if(array3.indexOf(array1[i]) == -1)
     array3.push(array1[i])
}
for(let i=0;i<array2.length;i++){
  if(array3.indexOf(array2[i]) == -1)
     array3.push(array2[i])
}

Решение ES5

Решение ES5 заменяет «циклы for». Вместо этого он использует встроенные функции массива, такие как concat и filter.

concat () можно использовать для объединения нескольких массивов. Но при этом не удаляются дубликаты.

filter () используется для определения того, присутствует ли элемент в «merged_array» или нет. Как и в традиционном цикле for, фильтр использует метод indexOf () для определения наличия элемента в merged_array.

Псевдокод для решения ES5

concat () массивы вместе и сохраните в другом массиве (A)

Используйте filter () для итерации по массиву (A). Отфильтруйте любой элемент, который встречается несколько раз, с помощью indexOf ().

Вычисление временной сложности

Для объединения двух массивов с помощью concat () и filter () временная сложность будет следующей:

Чтобы объединить массив из n элементов с другим массивом из m элементов: Big O (n + m)

Чтобы отфильтровать массив с помощью indexOf (): Big O (n²)

Общая временная сложность: Big O (n²)

Код

let array1 = ['a','b','c']
let array2 = ['c','c','d','e'];
let array3 = array1.concat(array2);
array3 = array3.filter((item,index)=>{
   return (array3.indexOf(item) == index)
})

Решение ES6

ES6 предлагает однострочное решение для объединения массивов без дубликатов. Он использует деструктуризацию и набор.

Деструктуризация - это способ присвоения от «Переменной 1» к «Переменной N» другой переменной, который следует схожим синтаксическим правилам. В данном случае это будет массив. О боже, почему это не было создано десять лет назад? Разве это не заменяет тонны избыточного кода? Может, нам нужно было дождаться прихода лучших.

Set - это встроенная коллекция в JavaScript, которая не поддерживает дубликаты. Ага, вот где расходятся concat () и Set. Concat не заботится о дубликатах. Каждая запись является уникальной во время конкатенации. Но Set проверяет наличие дубликатов и удаляет их. Проще говоря, большая часть нашей работы выполняется с помощью коллекции.

Псевдокод для решения ES6

деструктурируйте массивы до нового набора.

Сложность времени для решения ES6

Для объединения двух массивов с помощью Set временная сложность следующая:

Чтобы создать набор с массивами размера «n» и «m»: Big O (n + m)

Общая временная сложность, если n ›m: Big O (n)

Код

let array1 = ['a','b','c']
let array2 = ['c','c','d','e'];
let array3 = array1.concat(array2);
array3 = [...new Set([...array1,...array2])]

Заключение

Решение, предлагаемое ES6, является самым простым и наименее дорогим. При временной сложности O (n) это наиболее идеальный выбор для любого слияния двух или более массивов без дубликатов. Спасибо, что прочитали мою статью, надеюсь, она была вам полезна!