Как получить уникальные элементы в массиве?

Как я могу получить уникальные элементы в массиве в 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)

→ Ссылка