Javascript удалить повторяющиеся строки

Удаление повторяющихся объектов из массива JavaScript

Предположим, что у нас есть массив объектов, пример которого приведен ниже:

Первый и последний объект в массиве являются одинаковыми. Как удалить дубликаты из массива? На удивление, в JavaScript решить такую задачу довольно сложно. Чтобы понять это, рассмотрим, как удалить повторения из одномерного массива, элементами которого являются строки.

Удаление дубликатов из одномерных массивов (легкий способ)

Предположим, что у нас есть массив строк:

const strings = [ "My Sister the Serial Killer", "Educated", "My Sister the Serial Killer" ];

Чтобы удалить повторяющиеся элементы из такого массива, можно использовать метод filter() вместе с методом indexOf() . Он позволяет проверить, не повторяется ли какой-либо из элементов.

const filteredStrings = strings.filter((item, index) => < // Возврат к новому массиву, если индекс текущего элемента //совпадает с другим return strings.indexOf(item) === index; >);

strings.indexOf(item) всегда будет возвращать индекс первого вхождения элемента, мы можем выяснить, является ли текущий элемент повторяющимся в фильтрующей цикле. Если да, мы не возвращаем его в новый массив, созданный методом filter() .

Объекты не работают одинаково

Этот способ не подходит для сравнения объектов. В JavaScript любые два объекта с одинаковыми свойствами и значениями не считаются одинаковыми.

const a = < name: "My Sister the Serial Killer", author: "Oyinkan Braithwaite" >; const b = < name: "My Sister the Serial Killer ", author: "Oyinkan Braithwaite" >; a === b // false

В JavaScript объекты имеют ссылочный тип . Поэтому равными будут только ссылки на один и тот же объект. Таким образом, indexOf(object) в массиве объектов всегда будет возвращать индекс переданного элемента, даже если там есть другой объект с одинаковыми свойствами и значениями.

Мое решение

Единственным способом сравнения объектов является проверка свойств и значений каждого из них. Поэтому решение заключается в ручной проверке. Механизм реализации:

  1. Проверять каждый элемент в массиве на соответствие последующему, который идет после него.
  2. Проверять только те элементы, которые не были определены как дубликаты другого элемента.
  3. Если значения каждого свойства объектов одинаковы, проверить, имеют ли объекты одинаковые ключи.

Финальная функция выглядит так:

function removeDuplicates(arr) < const result = []; const duplicatesIndices = []; // Перебираем каждый элемент в исходном массиве arr.forEach((current, index) => < if (duplicatesIndices.includes(index)) return; result.push(current); // Сравниваем каждый элемент в массиве после текущего for (let comparisonIndex = index + 1; comparisonIndex < arr.length; comparisonIndex++) < const comparison = arr[comparisonIndex]; const currentKeys = Object.keys(current); const comparisonKeys = Object.keys(comparison); // Проверяем длину массивов if (currentKeys.length !== comparisonKeys.length) continue; // Проверяем значение ключей const currentKeysString = currentKeys.sort().join("").toLowerCase(); const comparisonKeysString = comparisonKeys.sort().join("").toLowerCase(); if (currentKeysString !== comparisonKeysString) continue; // Проверяем индексы ключей let valuesEqual = true; for (let i = 0; i < currentKeys.length; i++) < const key = currentKeys[i]; if ( currentJavascript удалить повторяющиеся строки !== comparisonJavascript удалить повторяющиеся строки ) < valuesEqual = false; break; >> if (valuesEqual) duplicatesIndices.push(comparisonIndex); > // Конец цикла >); return result; >

Наталья Кайда автор-переводчик статьи « Removing duplicate objects from an Array (is hard) »

Читайте также:  Html input style margin

Пожалуйста, опубликуйте ваши комментарии по текущей теме материала. Мы очень благодарим вас за ваши комментарии, отклики, лайки, подписки, дизлайки!

Источник

Как удалить дубликаты в массиве в JS

Необходимость удалить дубликаты в массиве в JS возникает не так уж редко. Например — чтобы удалить данные, когда кто-то дважды заполнил форму. На самом деле таких вариантов может быть сколько угодно. В этой статье мы рассмотрим три способа удаления дубликатов.

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

При помощи Set() создается объект из уникальных значений. Неявное использование этого объекта позволяет удалить дубликаты из массива.

Мы можем воспользоваться этим методом, только нужно будет еще преобразовать Set в новый массив. Выглядит это так:

let chars = ['A', 'B', 'A', 'C', 'B']; let uniqueChars = [. new Set(chars)]; console.log(uniqueChars);

2. Использование методов indexOf() и filter()

Метод indexOf() возвращает индекс первого вхождения элемента в массиве:

let chars = ['A', 'B', 'A', 'C', 'B']; chars.indexOf('B');

Дубликатом будет считаться элемент с индексом, отличным от значения indexOf() :

let chars = ['A', 'B', 'A', 'C', 'B']; chars.forEach((element, index) => < console.log(`$- $ - $`); >);
A - 0 - 0 B - 1 - 1 A - 2 - 0 C - 3 - 3 B - 4 - 1

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

let chars = ['A', 'B', 'A', 'C', 'B']; let uniqueChars = chars.filter((element, index) => < return chars.indexOf(element) === index; >); console.log(uniqueChars);

Если по какой-то причине нам нужны сами дубликаты, мы можем модифицировать нашу функцию, слегка изменив наше правило:

let chars = ['A', 'B', 'A', 'C', 'B']; let dupChars = chars.filter((element, index) => < return chars.indexOf(element) !== index; >); console.log(dupChars);

3. Использование методов includes() и forEach()

Функция include() возвращает true , если элемент есть в массиве, и false — если такого элемента в массиве нет.

В следующем примере мы перебираем элементы массива и добавляем в новый массив только те, которых там пока нет.

let chars = ['A', 'B', 'A', 'C', 'B']; let uniqueChars = []; chars.forEach((element) => < if (!uniqueChars.includes(element)) < uniqueChars.push(element); >>); console.log(uniqueChars);

В общем, удалить дубликаты в массиве в JS можно разными способами, выбирая наиболее подходящий для каждого конкретного случая.

Читайте также:  Div в php коде

От редакции Techrocks. Также рекомендуем статью «Как удалить элемент из массива в JavaScript».

Источник

JavaScript — удалить повторяющиеся строки

В этой статье я хотел бы показать вам два способа удаления повторяющихся строк из текста в JavaScript.

Прежде чем мы начнем, я настоятельно рекомендую вам ознакомиться с примерами выполнения решения на нашем веб-сайте:
JavaScript — удалить повторяющиеся строки

Мы будем использовать два метода:

filter() пример

В этом подходе используется шаблон функционального программирования. Я использовал filter() метод, который создает новый массив элементов, протестированных с помощью предоставленной функции.

В метод filter() я передал набор команд, удаляющих повторяющиеся строки.

Вы можете запустить этот пример здесь

reduce() пример

Этот подход был создан, чтобы показать, что можно получить тот же эффект, что и в примере выше, с помощью метода reduce() .

Вы можете запустить этот пример здесь

Если вы нашли это решение полезным, вы можете отреагировать на это сообщение или просто оставить комментарий, чтобы сообщить мне, что вы думаете. Спасибо за чтение и увидимся в следующий раз! 😊

Напишите нам! ✉

Если у вас есть какие-либо проблемы, которые нужно решить, или вопросы, на которые никто не может ответить, связанные с темой React или JavaScript, или вы ищете наставника, напишите нам на dirask.com -› Вопросы

Источник

Удаление повторяющихся строк с помощью javascript

У меня есть массив из 800 предложений. Я хочу удалить все дубликаты (предложения, которые имеют одинаковые точные слова, но в другом порядке) из массива. Так, например, “это предложение” и “это предложение” являются дубликатами. Только один из них должен оставаться в массиве (неважно, какой из них).

Моя первая идея заключалась в том, чтобы скопировать их один за другим в новый массив, каждый раз проверяя, существует ли предложение в новом массиве. Я бы выполнил это, перейдя через все элементы в новом массиве и используя следующий код для сравнения предложений:

Однако, это быстро становится слишком интенсивным с точки зрения вычислений и заставляет механизм javascript быть невосприимчивым.

Любые идеи о том, как сделать алгоритм более эффективным, будут оценены.

va = ["this is a sentence", "sentence this is", "sentence this is a"] vb = <> // dictionary of combined sorted words in each sentence vc = [] // output list of sentences without duplicates for (i=0;i a is sentence this) var combined = va[i].split(" ").sort().join(" "); if (!vb[combined]) < // if set of combined sorted words doesn't exist already vc.push(va[i]); // sentence isn't duplicated, push to output list vb[combined] = true // add set to dictionary >> alert(vc.join("\n")) 

Используйте объект в качестве поиска, чтобы получить быстрый хэш-стоп-чек. Это означает использование строки в качестве типа вашего ключа, что означает нормализацию case/ordering/etc слов сначала, чтобы получить уникальный ключ для каждой комбинации слов.

// Get key for sentence, removing punctuation and normalising case and word order // eg 'Hello, a horse!' -> 'x_a hello horse' // the 'x_' prefix is to avoid clashes with any object properties with undesirable // special behaviour (like prototype properties in IE) and get a plain lookup // function getSentenceKey(sentence) < var trimmed= sentence.replace(/^\s+/, '').replace(/\s+$/, '').toLowerCase(); var words= trimmed.replace(/[^\w\s]+/g, '').replace(/\s+/, ' ').split(' '); words.sort(); return 'x_'+words.join(' '); >var lookup= <>; for (var i= sentences.length; i-->0;)

Вам понадобится работа, если вам нужно поддерживать символы, отличные от ASCII ( \w не очень хорошо работает с Unicode в JS, и вопрос о том, что представляет собой слово на некоторых языках, является трудным). Кроме того, это “foo bar foo” то же предложение, что и “bar bar foo”?

Читайте также:  Создать массив строк php

Здесь что-то попробовать. Я не тестировал его работу на больших массивах, но я думаю, что все должно быть в порядке. Нет необходимости в jQuery.

function removeDuplicates(array) < var new_array = []; for(var i=0; i> return new_array; > Array.prototype.indexOf = function(item, optional_start_index) < for(var i=optional_start_index||0; ireturn -1; > 

Используйте его следующим образом:

var a = ["this is a name", "name is this a", "this name is a", "hello there"]; var clean_array = removeDuplicates(a); alert(clean_array); // outputs: a is name this,hello there 

Сортировка массива предложений, а затем цикл через него и удаление элемента, если он совпадает с предыдущим:

Я тестировал это в массиве с 800 строками, и он казался достаточно быстрым.

EDIT: Извините, не очень внимательно прочитал ваш вопрос.

Это очень простая реализация, которая использует некоторые jQuery.

var arr = ["This is a sentence", "Is this a sentence", "potatoes"]; var newArr = []; var sortedArr = []; $.each(arr, function(i) < var temp = this.toLowerCase().split(" ").sort(function(a,b) < return a >b; >).join(' '); if ($.inArray(temp, sortedArr) == -1) < sortedArr.push(temp); newArr.push(arr[i]); >>); //output $.each(newArr, function() < document.write(this + '
'); >);

Он использует три массива: источник, набор отсортированных предложений для соответствия и выходной массив. Согласование выполняется путем разделения предложения на пробелы, преобразования в нижний регистр и сортировки слов в алфавитном порядке, а затем перестройки строки предложения. Если это конкретное комбо было замечено раньше, оно не добавляется к результатам. Если это не так, добавляется.

Цикл в конце просто выводит результирующий массив.

Источник

Оцените статью