Как получить уникальные элементы в массиве?
Как я могу получить уникальные элементы в массиве в js? Я знаю, что есть new Set, но если в массиве будут объекты, то он не сработает
Например, этот код выведет это: [1, 2, { key: "1" }, { key: "1" }, { key: "1" }]
[...new Set([1, 1, 2, { key: "1" }, { key: "1" }, { key: "1" }])];
А мне нужен такой результат
[1, 2, { key: "1" }]
Ответы (2 шт):
Автор решения: Alexandr_Yakovlev
→ Ссылка
Решил таким образом:
const getUniques = array => {
const sortArray = [...new Set(array)];
const checkOtherTypes = arr => {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (JSON.stringify(arr[i]) === JSON.stringify(arr[j])) {
return checkOtherTypes(arr.filter((item, index) => index !== j));
}
if ([arr[i], arr[j]].every(item => item && typeof item === "object")) {
const getSortKeys = (obj, result = {}, keyTo) => {
const res = result;
const sortObj = Object.keys(obj).sort().reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
res[keyTo] = sortObj;
if (Object.values(sortObj).some(val => val && typeof val === "object")) {
for (let key in sortObj) {
if (sortObj[key] && typeof sortObj[key] === "object") {
return getSortKeys(sortObj[key], sortObj, key);
}
}
}
return res;
}
const sortObj1 = getSortKeys(arr[i]);
const sortObj2 = getSortKeys(arr[j]);
if (JSON.stringify(sortObj1) === JSON.stringify(sortObj2)) {
return checkOtherTypes(arr.filter((item, index) => index !== j));
}
}
}
}
return arr;
}
return checkOtherTypes(sortArray);
}
// [{ 1: { 2: { ... }, v: 2, key: 2 } }]
console.log(getUniques([{ 1: { v: 2, key: 2, 2: { z: 4, s: 5 } } }, { 1: { key: 2, v: 2, 2: { s: 5, z: 4 } } }]));
Автор решения: HaZcker
→ Ссылка
Вот один из вариантов решения для вашего массива
function getUniqArr(arr) {
let arrFromSet = Array.from(new Set(arr))
arrFromSet = arrFromSet.map(el => {
return typeof el === 'object'
? JSON.stringify(el)
: el
})
const result = Array.from(new Set(arrFromSet))
return result.map(el => JSON.parse(el))
}
Но не подходит если в массиве будут другие массивы
Для решения этой проблемы функцию нужно немного дописать, например добавив рекурсию
UPD
Так же нужно учесть что тип массива так же является 'object'
Чтобы узнать является ли элемент массивом используется Array.isArray(someArr)