我有一个看起来像这样的对象数组:
const arr = [
{
"name": "Day",
"value": "Monday"
},
{
"name": "Month",
"value": "November"
},
{
"name": "Day",
"value": "Monday"
},
{
"name": "Month",
"value": "December"
},
{
"name": "Day",
"value": "Friday"
},
{
"name": "Month",
"value": "November"
},
{
"name": "Day",
"value": "Friday"
},
{
"name": "Month",
"value": "December"
}
]
但我需要将对象数组修改为:
const final = [
{
"name": "Day",
"values": [
"Monday",
"Friday"
]
},
{
"name": "Month",
"values": [
"November",
"December"
]
}
]
我可以用以下方法过滤掉重复项:
const filtered = arr.filter(
(v, i, a) =>
a.findIndex(v2 => v?.name === v2?.name && v?.value === v2?.value) === i
);
但我坚持采用一种有效的方法来做到这一点,而无需 Lodash 或 下划线,并且我尝试使用
Object.assign()
但我的实现不起作用:
const test = filtered.map(({ name, value }) =>
Object.assign({ name, value: [] }, (name, value))
);
console.log(test)
我想我之前见过这个问题并测试过以下答案:
在对象数组中,我可以组合具有相同名称但值位于字符串数组中的对象吗?
使用 reduce 和预先分配了天和蛾元素的起始值,使用
Set
自动忽略重复项,然后在减少所有内容后,将该集合转换为数组:
const arr = [
{
"name": "Day",
"value": "Monday"
},
{
"name": "Month",
"value": "November"
},
{
"name": "Day",
"value": "Monday"
},
{
"name": "Month",
"value": "December"
},
{
"name": "Day",
"value": "Friday"
},
{
"name": "Month",
"value": "November"
},
{
"name": "Day",
"value": "Friday"
},
{
"name": "Month",
"value": "December"
}
]
const final = arr.reduce((t, {name, value}) => {
t.find(e => e.name === name)?.values.add(value);
return t;
}, [
{name:`Day`, values: new Set()},
{name:`Month`, values: new Set()}
]);
final.forEach(e => e.values = [...e.values]);
console.log(final);