фильтрация дублей объекта по его значению
Имеется объект вида:
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'));