我有一个对象数组,如下所示:
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)
我想我以前见过这个问题并测试过以下答案:
- 如何将数组与值为数组的对象合并
- 如何按键合并两个对象数组并在单个对象数组中保留唯一键?
- 从 Object 数组中,获取仅匹配键值的数组
- 从对象数组中,提取属性值作为数组
- 将同一数组内的多个对象合并为一个对象[重复]
在对象数组中,我可以组合具有相同名称但在字符串数组中具有值的对象吗?
使用带有预先分配的天和蛾元素的起始值的reduce ,使用Set自动忽略重复项,然后在减少所有内容后,将该集合转换为数组: