Удаление дубликатов из массивов и строк в JavaScript

Источник: «Remove Duplicates from Arrays and Strings in JavaScript»
Удаление дубликатов — распространённая проблема в программировании, возникающая в различных контекстах, например, при очистке данных или обеспечении уникальности записей. Этот вопрос могут задать на собеседовании, поскольку он довольно прост и может подготовить собеседника к более сложным вопросам.

Рассмотрим два решения задачи: одно для удаления дубликатов из массивов, другое — для удаления дубликатов из строк (хотя они очень похожи).

На самом деле всё довольно просто, хотя если вы новичок в программировании, то, возможно, не знаете, как это сделать.

Удаление дубликатов из массивов

В программировании существует несколько способов достижения цели. Именно поэтому рассмотрим два способа удаления дубликатов из массива. В первом случае используем итеративный подход с помощью цикла for, а во втором — объект Set.

Итеративный подход

function removeDuplicates(arr) {
const uniqueArr = [];

for (let i = 0; i < arr.length; i++) {
if (!uniqueArr.includes(arr[i])) {
uniqueArr.push(arr[i]);
}
}
return uniqueArr;
}

removeDuplicates([1, 1, 2, 3, 4, 5, 4, 1]); // [ 1, 2, 3, 4, 5 ]
removeDuplicates(['a', 'b', 'a', 'c', 'b']); // [ 'a', 'b', 'c' ]

В приведённом примере есть несколько моментов, на которые следует обратить внимание. Во-первых, мы объявляем пустой массив uniqueArr. Как можно догадаться, в этом массиве будут храниться уникальные значения, с которыми сталкивается код, перебирая исходный массив, arr.

Код пробегает по массиву arr, проверяя, if uniqueArr содержит значение или нет. Если нет, то push значение в uniqueArr.

Использование Set

Объект Set в JavaScript автоматически обеспечивает уникальность всех значений. Эту особенность можно использовать для удаления дубликатов из массива. Это невероятно просто и почти похоже на читерство, но это так.

function removeDuplicates(arr) {
return [...new Set(arr)];
}

removeDuplicates([1, 2, 2, 3, 4, 4, 5]); // [ 1, 2, 3, 4, 5 ]

Использование метода filter

Другой способ удаления дубликатов — использование метода filter в сочетании с indexOf.

function removeDuplicates(arr) {
return arr.filter((item, index) => arr.indexOf(item) === index);
}

removeDuplicates([1, 2, 2, 3, 4, 4, 5]); // [ 1, 2, 3, 4, 5 ]

Во-первых, метод filter создаёт поверхностную копию части массива, отфильтровывая его до элементов, прошедших проверку. indexOf возвращает первый индекс, по которому данный элемент встречается в массиве, или -1, если он отсутствует.

В качестве примера можно создать массив случайных фруктов:

const fruit = ['apple', 'banana', 'cherry'].

А если необходимо проверить индекс элемента, можно воспользоваться методом: fruit.indexOf('banana');, который вернёт 1, индекс banana.

Удаление дубликатов из строк

На самом деле большой разницы в этих решениях нет, есть лишь незначительные моменты, о которых следует знать. Мы почти исключили строки из статьи, но, вероятно, стоит обратить внимание на эти незначительные различия. Так что давайте их рассмотрим.

Итеративный подход

function removeDuplicates(str) {
let result = '';
for (let i = 0; i < str.length; i++) {
if (!result.includes(str[i])) {
result += str[i];
}
}
return result;
}

removeDuplicates('javascript'); // javscript

Использование Set

function removeDuplicates(str) {
return [...new Set(str)].join('');
}

removeDuplicates('javascript'); // javscript

Использование метода filter

function removeDuplicates(str) {
return str.split('').filter((char, index) => str.indexOf(char) === index).join('');
}

removeDuplicates('javascript'); //javscript

Итак, как вы видите, в приведённых выше блоках кода нет особой разницы. Для работы со строками мы просто ввели метод split() и join(). В итеративном решении также нет метода push() в переменной пустой строки, поскольку это метод массива.

Заключение

Как уже говорилось во введении, об этом могут спросить на собеседовании, для оценки ваших знаний JavaScript. Мы рассмотрели три различных способа достижения одной и той же цели, и стоит быть в курсе всех этих способов. Например, если вы использовали метод filter, интервьюер может попросить придумать другое решение, не использующее метод filter.

Надеемся, вам понравилась эта статья. Напишите в комментариях, что думаете по этому поводу!

Комментарии


Дополнительные материалы

Предыдущая Статья

Использование async и defer для управления скриптами

Следующая Статья

Используйте useId() вместо вручную созданных ID