JavaScript如何统计对象数组中各人名出现次数及对应总价
实现思路
- 用临时对象做中间映射,以人名为key存储对应的统计数据,只需遍历一次原数组即可完成两个字段的统计,时间复杂度为O(n)
- 遍历完成后将临时映射的value直接转为目标数组结构即可
注意点
原数据中的price是字符串类型,统计总价时需要先转为数字,避免出现字符串拼接的异常结果。你之前写的次数统计代码存在两个问题:
- counts声明为数组,但实际用对象键值的方式存储数据,逻辑不匹配
- 遍历取name时错误使用
x[0],原数组项是对象,应该用x.name取值
完整实现代码
const obj = [ {'name':'sven','price':'10'}, {'name':'jan','price':'12'}, {'name':'john','price':'5'}, {'name':'nick','price':'13'}, {'name':'sven','price':'11'}, {'name':'jan','price':'7'}, {'name':'nick','price':'9'}, ]; const tempMap = {} obj.forEach(item => { const name = item.name const price = Number(item.price) // 首次出现的人名初始化统计数据 if(!tempMap[name]) { tempMap[name] = { person: name, count: 0, totalPrice: 0 } } // 更新统计值 tempMap[name].count += 1 tempMap[name].totalPrice += price }) // 转为目标数组结构,如需count和totalPrice为字符串可自行转类型 const counts = Object.values(tempMap) console.log(counts)
输出结果
[ { person: 'sven', count: 2, totalPrice: 21 }, { person: 'jan', count: 2, totalPrice: 19 }, { person: 'john', count: 1, totalPrice: 5 }, { person: 'nick', count: 2, totalPrice: 22 } ]
内容的提问来源于stack exchange,提问作者Skinsky Gnudy
相关产品推荐
相关产品推荐

