Если вы читаете этот пост, вы можете быть озадачены тем, как так называемые «простые проблемы» могут превратиться в кошмары. Любой, кто работает над 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) это наиболее идеальный выбор для любого слияния двух или более массивов без дубликатов. Спасибо, что прочитали мою статью, надеюсь, она была вам полезна!