方法一:
let fruits =
[{
name: 'apple',
value: 1
},
{
name: 'apple',
value: 2
}, // 总计3个苹果
{
name: 'banana',
value: 2
},
{
name: 'banana',
value: 3
}]; // 总计5个香蕉
let fruitTotal = []; // 存最终数据结果
// 数据按照水果名称进行归类
let nameContainer = {}; // 针对键name进行归类的容器
fruits.forEach(item => {
nameContainer[item.name] = nameContainer[item.name] || [];
//当逻辑或||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。
nameContainer[item.name].push(item);
});
console.log(nameContainer, 'nameContainer'); // 按照水果名称归类完成:{ apple: Array(2), banana: Array(2) }
// 统计不同种类水果的数量
let fruitName = Object.keys(nameContainer); // 获取水果种类:["apple", "banana"]
console.log(fruitName, 'fruitName')
fruitName.forEach(nameItem => {
let count = 0;
nameContainer[nameItem].forEach(item => {
count += item.value; // 遍历每种水果中包含的条目计算总数
});
fruitTotal.push({ 'name': nameItem, 'total': count });
});
console.log(fruitTotal);
// 输出结果:
// [{ name: "apple", total: 3 },
// { name: "banana", total: 5 }]
//筛选含有同一个属性的值,存放在一个数组对象里
方法二:利用数组Array.reduce函数处理,代码更加简洁
let fruits2 =
[{
name: 'apple',
value: 0.1
},
{
name: 'apple',
value: 0.2
},
{
name: 'banana',
value: 0.3
},
{
name: 'banana',
value: 0.4
}];
let oldArray = JSON.parse(JSON.stringify(fruits2))
let newArray = []
newArray = oldArray.reduce((total, cur, index) => {
if (total) {
let hasValue = total.findIndex(current => {
return current.name === cur.name
})
// total 中不包含这一项,则push到数组
hasValue === -1 && total.push(cur)
// total 中包含这项,则累加需要统计的数值
hasValue !== -1 && (total[hasValue].value = (total[hasValue].value.toFixed(2) * 10 + cur.value.toFixed(2) * 10) / 10)
return total
}
}, [])
console.log(newArray)
本站素材来自用户分享,仅限学习交流请勿用于商业用途。如损害你的权益请联系客服QQ:201240120 给予处理。
还没有评论哦!