Как оставить в массиве только уникальные значения js
Чтобы оставить в массиве только уникальные значения, воспользуемся таким лайфхаком:
const names = ['Karina', 'Ilona', 'Petr', 'Maks', 'Ilona', 'Maks'];
const uniqueNames = new Set(names); // создаём коллекцию уникальных значений
console.log(Array.from(uniqueNames)); // => [ 'Karina', 'Ilona', 'Petr', 'Maks' ]
// преобразуем в массив
Документация:
Set
Чтобы получить из массива уникальные значения, можно воспользоваться простым алгоритмом:
- Инициируем простой массив, в который будем складывать результат
- Проходимся по исходному массиву и на каждой итерации проверяем, если в результате еще нет текущего элемента, то добавляем его в результат.
Для реализации можно использовать либо цикл, либо встроенные методы для перебора массива, например reduce
:
const items = ['item1', 'item2', 'item1', 'item3', 'item2', 'item4'];
const result = items.reduce((acc, item) => {
if (acc.includes(item)) {
return acc; // если значение уже есть, то просто возвращаем аккумулятор
}
return [...acc, item]; // добавляем к аккумулятору и возвращаем новый аккумулятор
}, []);
console.log(result); // => ['item1', 'item2', 'item3', 'item4']
По сути как первое решение, но чуть усовершенствованное. Работает на ВСЕХ типах, включая объекты и функции (но кроме null/false/undefined)
const options = [
'Раз',
2,
3,
true,
(a, b) => a + b,
4,
'Раз',
56,
{ a: 1, b: 0 },
3,
2,
(a, b) => a + b,
'Раз',
{ a: 1, b: 0 },
1,
false,
false,
true,
(a, b) => a + b,
];
const getUniqueOptions = (options) => {
return options.reduce(
(res, cur) =>
res.find((find) => JSON.stringify(find) === JSON.stringify(cur))
? res
: [...res, cur],
[]
).sort((a, b) => a - b); // и сортировочка для красоты :)
};
console.log(getUniqueOptions(options)); // ['Раз', 2, 3, true, ƒ, 4, 56, {…}, 1, false, false]
Чтобы оставить в массиве только уникальные значения, можно воспользоваться методами filter()
и indexOf()
:
const array = [1, 2, 1, 2, 3, 4, 5, 2, 4, 1, 1, 6];
const getUnique = (arr) => {
return arr.filter((el, ind) => ind === arr.indexOf(el));
};
console.log(getUnique(array)); // => [ 1, 2, 3, 4, 5, 6 ]
Принцип работы заключается в том, что мы сравниваем индекс текущего элемента массива (ind
) с индексом первого вхождения этого элемента в массив (arr.indexOf(el)
). И если они не равны, то это означает, что вхождение данного элемента в массив является не первым, то есть элемент ранее уже встречался в массиве.
console.log(Array.from(new Set([1, 2, 1, 2, 3, 4, 5, 2, 4, 1, 1, 6])))
// [ 1, 2, 3, 4, 5, 6 ]