- array_unique — Убирает повторяющиеся значения из массива
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- 3 способа удаления дубликатов из массива в JS
- Первый способ удаления дубликатов из массива.
- Второй способ удаления дублей
- Массив дублей
- Третий способ удаления дублей
- Комментарии ( 0 ):
- Способы устранения дублей в JavaScript-массивах
- Массив с повторяющимися строками или числами
- Что делает функция unDuplicateArraySingleValues
- Удаление дублей с помощью только методов массива
- Массив из повторяющихся объектов
- Что делает функция unDuplicateArrayObjects
- как удалить из массива повторяющиеся элементы? C++
- 4 ответа 4
- Как удалить из массива повторяющиеся элементы?
- 9 ответов 9
array_unique — Убирает повторяющиеся значения из массива
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
array_unique — Убирает повторяющиеся значения из массива
Описание
Принимает входной array и возвращает новый массив без повторяющихся значений.
Обратите внимание, что ключи сохранятся. array_unique() сначала сортирует значения как строки, сохраняет первый встреченный ключ для каждого значения и игнорирует все последующие ключи. Это не означает, что первый ключ каждого значения неотсортированного array будет сохранён.
Замечание: Два элемента считаются одинаковыми в том и только в том случае, если (string) $elem1 === (string) $elem2. Другими словами: если у них одинаковое строковое представление, то будет использован первый элемент.
Список параметров
Можно использовать необязательный второй параметр sort_flags для изменения поведения сортировки с помощью следующих значений:
Виды сортировок флагов:
- SORT_REGULAR — нормальное сравнение элементов (типы не меняются)
- SORT_NUMERIC — элементы сравниваются как числа
- SORT_STRING — элементы сравниваются как строки
- SORT_LOCALE_STRING — сравнивает элементы как строки, с учетом текущей локали.
Возвращаемые значения
Возвращает отфильтрованный массив.
Список изменений
Версия | Описание |
---|---|
5.2.10 | Значение по умолчанию параметра sort_flags изменено обратно на SORT_STRING . |
5.2.9 | Добавлен необязательный параметр sort_flags , по умолчанию равный SORT_REGULAR . До версии 5.2.9, это функция сортировала массив с помощью SORT_STRING . |
Примеры
Пример #1 Пример использования array_unique()
Результат выполнения данного примера:
Пример #2 array_unique() и типы:
Источник
3 способа удаления дубликатов из массива в JS
Существует три способа удаления дубликатов из массива. В данной статье рассмотрим каждый из них и выясним наиболее подходящий.
Первый способ удаления дубликатов из массива.
Перед нами массив arr, где дублируются некоторые числа. Наша задача создать новый массив или преобразовать текущий массив, но без дубликатов. Для решения задачи, воспользуемся объектом set. Объект set может содержать в себе только уникальные элементы.
// Массив arr
const arr = [1, 2, 3, 5, 1, 6, 2, 5, 6, 7];
console.log(arr);
Создадим новую переменную arr_1 и применим объект set к исходному массиву. Метод new Set создает новую коллекцию. В результате мы получили новый набор (коллекцию) с уникальными числами, а все дубли исчезли.
let arr_1 = new Set(arr);
console.log(arr_1);
Элементы набора заключены в фигурные скобки, а массива — в квадратные. Как же нам получить все-же массив? Это можно сделать двумя способами: через оператор расширения spreаd (. ) или через метод Array.from().
// Spread
let arr_1 = [. new Set(arr)];
console.log(arr_1);
или аналогичный вариант
// Array.from
let arr_1 = Array.from(new Set(arr));
console.log(arr_1);
Оператор spread и метод Array.from() проделали одну и туже работу — преобразовали коллекцию в массив.
Второй способ удаления дублей
Метод filter() создает новый массив. Он вызывает callback функцию для каждого элемента массива. Элементы массива не прошедшие проверку, вылетают из вновь созданного массива. Метод filter() передает в callback функцию два параметра исходного массива: элемент массива и его индекс (порядковый номер в массиве). Метод indexOf сверяет индексы, начиная с первого, в исходном и в новом массиве. Если позиция текущего элемента совпадает с найденной, значит этот элемент уникальный и он добавляется в новый массив. Но, если индексы у одного и того же элементы не совпадают, значит это дубликат и он уже не попадет в новый массив.
// Filter
let arr_2 = arr.filter((item, index) => <
return arr.indexOf(item) === index
>);
console.log(arr_2);
Массив дублей
Если перед знаками равно поставить восклицательный знак, то мы получим противоположный эффект. В новом массиве останутся только дубли.
let arr_2 = arr.filter((item, index) => <
return arr.indexOf(item) !== index
>);
console.log(arr_2);
Третий способ удаления дублей
Метод reduce() тоже метод перебора массива и он принимает callback функцию с двумя параметрами: result и item. В переменной result будет накапливаться результат, а item является текущим элементом. Метод includes проверяет, есть ли текущий элемент в переменной result. Если есть, то возвращается result и ничего не происходит. В противном случае, мы добавляем в result текущий элемент и все это преобразуем обратно в массив.
// Reduce
let arr_3 = arr.reduce((result, item) => <
return result.includes(item) ? result : [. result, item];
>, []);
console.log(arr_3);
Первый способ по удалению дубликатов из массива оказался самым простым и коротким. Второй способ я люблю за дополнительную возможность сформировать массив из дубликатов. Ну, а третий способ слишком замороченный и приходится писать больше кода. Поэтому, я выбираю первый способ.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Источник
Способы устранения дублей в JavaScript-массивах
Несколько способов устранения дублей в JavaScript-массивах без использования циклов, с помощью объекта Set или методов массива: filter(), reduce() и пр.
Массив с повторяющимися строками или числами
В первом массиве повторяются только строки, во втором будут только повторяющиеся числа, в третьем — смесь из чисел и строк.
Чтобы избавиться от повторяющихся данных, можно воспользоваться объектом Set . Set принимает только уникальные значения. При этом, учитывается тип значения, т.е. число 1 и 1 в строке будут различаться.
«Объекты Set представляют коллекции значений, по которым вы можете выполнить обход в порядке вставки элементов. Значение элемента в Set может присутствовать только в одном экземпляре, что обеспечивает его уникальность в коллекции Set » — MDN Web Docs.
Если поместить массивы с дублями в объект Set и вывести его содержимое в консоль, будет видно, что повторяющиеся значения удалены и в Set остались только уникальные значения строк и чисел.
Однако, теперь массивы превратились в объекты Set , а это не одно и то же. Поэтому нужно преобразовать каждый Set обратно в массив.
Один из простых способов сделать это — использовать синтаксис . spread внутри квадратных скобок [. ] .
Для многократного использования всех преобразований, лучше разместить их в функции:
Что делает функция unDuplicateArraySingleValues
В функцию передаётся параметр array , в котором ожидается не пустой массив. В операторе if проверяется, что передан массив и в нём есть элементы.
Если условия выполняются, массив вызовом new Set() преобразуется в объект Set . Затем с помощью . spread синтаксиса Set превращается обратно в массив.
Удаление дублей с помощью только методов массива
Если не хочется выполнять лишние преобразования в Set и обратно, можно использовать только методы массивов, например с помощью array.reduce() :
Или так, с помощью array.filter() :
Этот вариант хорош ещё тем, что если его немного переделать, то легко можно получить наоборот массив из дублей значений исходного, так:
Массив из повторяющихся объектов
Здесь пример более сложного массива с дублями объектов.
Значения нескольких свойств ( id=2 и value=»c» ) дублируются.
Понадобится ещё одна функция, которая проверит такой массив. Используя переданное вторым аргументом название свойства (например «id» ), она определит, есть ли в массиве объект с таким же значением в таком же свойстве.
Что делает функция unDuplicateArrayObjects
Эта функция подойдёт для массива из объектов с одинаковыми названиями свойств. После преобразования в новом массиве должны остаться только объекты, у которых значение одного из свойств (в примере — id ) будет уникальным.
Теперь в функцию передаются 2 аргумента: array — исходный массив с объектами и propertyName — свойство в этих объектах, у которого должны быть уникальные значения.
В операторе if проверяется, что в array передан массив и в нём есть элементы, а также propertyName для которого ожидается не пустая строка.
В константу-массив objectValuesArrayFromKey сохраним значения свойства всех объектов из исходного массива, название которого передано в параметре propertyName .
В uniqueValues теперь нужно удалить повторяющиеся значения. Для этого подойдёт предыдущая функция unDuplicateArraySingleValues(array) , которая вернёт новый массив с уникальными значениями.
В конце, с помощью массива uniqueValues возвращается массив только с объектами, у которых значение запрашиваемого свойства (в примере — id ) будет уникально.
Источник
как удалить из массива повторяющиеся элементы? C++
есть массив massC в котором необходимо удалить повторяющиеся элементы ну и потом их сумму узнаьб на главное что меня интересует как удалить повторяющиеся
4 ответа 4
massA — исходные массив с повторяющимися значениями massB — результирующий массив без повторений massC — (в моём коде) временный рабочий массив
Контейнер std::unordered_set (C++11) помогает эффективно решать подобный задачки.
А уникальные элементы можно просто перемещать к началу, в том же массиве, затирая те элементы, которые уже встречались.
Update
Думаю, после комментариев и правки ответа рядом участников,
(первоначально код содержал if (s.find(a[i]) == s.end()) < . т.е. явно проводилась проверка наличия данных в множестве s )
имеет смысл подробнее посмотреть на функцию insert() , которая либо вставляет новый элемент в множество, либо сообщает о том, что такое значение в нем уже есть.
Эта функция возвращает вот такую пару значений:
Первый член пары указывает на элемент в множестве, а второй сообщает был ли элемент только что добавлен (true) или уже существовал (false).
Анализ этого члена и используется при подсчете суммы уникальных элементов массива и удалении дубликатов.
Кстати, возможно кому-нибудь окажется полезным простейший код (без сторонних библиотек, Си и C++), реализующий множество целых ограниченного размера, который позволяет только добавлять новые элементы.
Источник
Как удалить из массива повторяющиеся элементы?
Например: [8,2,2,5] => [8,2,5]
- Массив не отсортирован.
- Повторяющиеся элементы всегда идут подряд.
Я придумал решение с двумя циклами и вторым массивом. Вот решил спросить может есть какое нибудь более элегантное решение.
9 ответов 9
Алгоритм с линейной асимптотикой.
В этой реализации изменяет исходный массив, но можно легко переделать на создание нового.
Короткое решение выглядит так:
Чуть умнее можно так:
Объединение этих двух подходов:
Самое быстрое решение (без вызовов функций):
Вариант с использованием Set из ECMA2015 и Array.from
Решение для вашего случая (все одинаковые элементы стоят рядом):
Хотя я бы просто взял уже готовое решение https://lodash.com/docs#sortedUniq
Учитывая, что повторы идут подряд, можно без дополнительного массива менять исходный: пройтись по элементам, запоминая предыдущий, и удаляя хвосты повторов:
Еще один вариант,
получения уникальных элементов с помощью [спреда и сетки] т.е. [Spread & Set].
Оставлю здесь ↧ эту короткую строчку кода, может кому-то пригодится. Эх, была не была.
На всякий случай добавлю пример.
По-моему самое лаконичное и красивое решение для современного JS (ES6+):
В set-ах не могут храниться повторяющиеся элементы, поэтому преобразование массива в set и обратно просто выкидывает все лишние, сортировка при этом остаётся прежней.
Для IE способ не подойдёт из-за отсутствия в нём поддержки new Set(iterable), придётся перебирать вручную, либо найти полифилл.
Источник