我有一个对象数组。如果tag
属性相同,则需要合并数组的元素,然后将这些对象的counter
属性相加。
这是我的示例数组:
[
{
"tag": "#sala",
"state": {
"counter": 1
}
},
{
"tag": "#sala",
"state": {
"counter": 2
}
}
]
这是合并后数组的外观:
[
{
"tag": "#sala",
"state": {
"counter": 3
}
}
]
答案 0 :(得分:2)
您可以使用数组归约函数,并在reduce回调内部使用findIndex
来检查累加器数组是否具有带有相同标签的对象。如果找到具有相同标签的对象,则更新该对象中的计数器,否则将当前对象推入累加器数组
let data = [{
"tag": "#sala",
"state": {
"counter": 1
}
},
{
"tag": "#sala",
"state": {
"counter": 2
}
}
];
let newData = data.reduce(function(acc, curr) {
let findTagIndex = acc.findIndex(item => item.tag === curr.tag);
if (findTagIndex === -1) {
acc.push(curr)
} else {
acc[findTagIndex].state.counter += curr.state.counter
}
return acc;
}, []);
console.log(newData)
答案 1 :(得分:1)
您可以使用Array#reduce构建一个对象映射标记到计数器,然后将Object.entries与Array#map一起使用,将对象转换回原始数组结构”。
let data = [{
"tag": "#sala",
"state": {
"counter": 1
}
},
{
"tag": "#sala",
"state": {
"counter": 2
}
}
];
let newData = data.reduce(
( obj, { tag, state: { counter } } ) => ( obj[ tag ] = counter + (obj[ tag ] || 0), obj ), { }
);
// Object mapping tags to counter sums
console.log( newData );
// If you need your original array structure:
newData = Object.entries( newData ).map( ( [ key,value ]) => ( { tag: key, state: { counter: value } } ) );
console.log( newData );