фильтрация дублей объекта по его значению

Имеется объект вида:

const Param = {
  variant1: {
    id: 1,
    color: 'red',
  },
  variant2: {
    id: 2,
    color: 'red',
  },
  variant3: {
    id: 3,
    color: 'blue',
  },
  variant4: {
    id: 4,
    color: 'blue',
  }
}

необходимо удалять объект с дублирующемся цветом. На выходе должно получиться что-то типо такого:

const Param = {
  variant1: {
    id: 1,
    color: 'red',
  },
  variant3: {
    id: 3,
    color: 'blue',
  },
}

Как можно это сделать ?


Ответы (3 шт):

Автор решения: Alexander Lonberg

const Param = {
  variant1: {
    id: 1,
    color: 'red',
  },
  variant2: {
    id: 2,
    color: 'red',
  },
  variant3: {
    id: 3,
    color: 'blue',
  },
  variant4: {
    id: 4,
    color: 'blue',
  }
}

const colors = []
console.log(
  Object.fromEntries(
    Object.entries(Param).filter(([_, { color }]) =>
      colors.includes(color) ? false : (colors.push(color), true)
    )
  )
)

→ Ссылка
Автор решения: Александр Лесив

const Param = getObj();

filterColors(Param);

console.log(Param);

function filterColors(Obj) {
  const colorsIncluded = new Set;
  for (let key in Obj) {
    if (colorsIncluded.has(Obj[key].color)) {
      delete Obj[key];
    } else {
      colorsIncluded.add(Obj[key].color)
    }
  }
}

function getObj() {
  return ({
    variant1: {
      id: 1,
      color: 'red',
    },
    variant2: {
      id: 2,
      color: 'red',
    },
    variant3: {
      id: 3,
      color: 'blue',
    },
    variant4: {
      id: 4,
      color: 'blue',
    }
  });
}

→ Ссылка
Автор решения: Yaant

Можно и так (вариант извращенный, к практическому использованию не рекомендуется):

const obj = {
  variant1: {
    id: 1,
    color: 'red',
  },
  variant2: {
    id: 2,
    color: 'red',
  },
  variant3: {
    id: 3,
    color: 'blue',
  },
  variant4: {
    id: 4,
    color: 'blue',
  }
}

function uniqByField(obj, fld) {
  let values = new Set(Object.values(obj).map(val => val[fld]));
  let keys = [...values].map(val => Object.keys(obj).find(key => obj[key][fld] === val));
  let result = {};
  keys.forEach(key => result[key] = obj[key]);
  return result;
}

console.log(uniqByField(obj, 'color'));

→ Ссылка