我有1个对象数组,想要迭代它中的对象。因此,如果找到重复的名称条目,我必须添加计数器值,它应该合并。最终的对象数组必须具有唯一的条目。
对象=
[
{name: 'Voice', counter: 1},
{name: 'tele', counter: 1},
{name: 'equip', counter: 1},
{name: 'equip', counter: 2},
{name: 'Voice', counter: 1}
]
结果应该是: -
ObjectB =
[
{name: 'Voice', counter: 2},
{name: 'tele', counter: 1},
{name: 'equip', counter: 3}
]
你可以使用array.reduce
和一些逻辑如下。
DEMO
let data = [{name: 'Voice', counter: 1},
{name: 'tele', counter: 1},
{name: 'equip', counter: 1},
{name: 'equip', counter: 2},
{name: 'Voice', counter: 1}]
var result = [];
data.reduce(function (res, value) {
if (!res[value.name]) {
res[value.name] = {
name: value.name,
counter: 0
};
result.push(res[value.name])
}
res[value.name].counter += value.counter
return res;
}, {});
console.log(result)
您可以使用Map
并将所有counter
值相加,按name
分组。
var data = [{ name: 'Voice', counter: 1 }, { name: 'tele', counter: 1 }, { name: 'equip', counter: 1 }, { name: 'equip', counter: 2 }, { name: 'Voice', counter: 1 }],
unique = Array.from(
data.reduce((m, { name, counter }) => m.set(name, (m.get(name) || 0) + counter), new Map),
([name, counter]) => ({ name, counter })
);
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }
试试这种方法:
const arr = [
{name: 'Voice', counter: 1},
{name: 'tele', counter: 1},
{name: 'equip', counter: 1},
{name: 'equip', counter: 2},
{name: 'Voice', counter: 1}
];
const resultObj = arr.reduce((acc, item) => {
acc[item.name] = (acc[item.name] || 0) + item.counter;
return acc;
}, {})
const resultArr = Object.entries(resultObj).map(entry => ({
name: entry[0],
counter: entry[1]
}))
document.body.innerHTML = `<pre>${JSON.stringify(resultArr, null, 2)}</pre>`
您可以使用reduce从列表中对具有相同name
的对象进行分组。稍后如果找到具有相同名称的对象,则增加counter
,否则将对象推入阵列。
var arr = [{name: 'Voice', counter: 1},
{name: 'tele', counter: 1},
{name: 'equip', counter: 1},
{name: 'equip', counter: 2},
{name: 'Voice', counter: 1}];
var newArray = arr.reduce((acc, item)=>{
var element = acc.find(obj => obj['name'] === item['name']);
if(element){
element['counter'] = element['counter'] + 1;
}else{
acc.push(item);
}
return acc;
}, []);
console.log(newArray);
你可以使用lodash reduce功能
let data = [{name: 'Voice', counter: 1},
{name: 'tele', counter: 1},
{name: 'equip', counter: 1},
{name: 'equip', counter: 2},
{name: 'Voice', counter: 1}];
data = _.reduce(data, (arr, n)=> {
const index = _.findIndex(arr,{name: n.name});
if(index !== -1){
arr[index].counter += 1;
} else {
arr.push(n);
}
return arr;
},[]);
console.log(data);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>