如何基于JSON响应统计同类产品总数量并生成指定格式数组
报错原因
- 首先你的中间数组存在语法错误:
["Iphone11",3]和后续["nord128",6]之间缺少逗号,JS 解析时会把后者识别为前者的下标访问操作,自然无法读取到[0]属性。 - 其次相邻比对的逻辑前提是同productName的元素已经连续排列,但你的原始数据里nord128的条目中间穿插了Iphone11,就算修复语法问题,也没法完成全量汇总。
正确实现方案
推荐用对象做中间汇总再转嵌套数组的方案,逻辑更简洁,兼容性更强:
const res = [ {productName:"nord128",quantiy: 4}, {productName:"nord128", quantiy:5}, {productName:"nord128", quantiy:8}, {productName:"Iphone11",quantiy:3}, {productName:"nord128",quantiy:6} ] // 第一步:用对象统计各产品总数量 const countMap = {} res.forEach(item => { const name = item.productName countMap[name] = (countMap[name] || 0) + item.quantiy }) // 第二步:转成目标嵌套数组格式 const result = Object.entries(countMap) console.log(result) // 输出 [["nord128", 23], ["Iphone11", 3]]
如果你一定要用相邻比对的方法实现,需要先对数组按productName排序再做汇总:
// 先给你生成的中间数组按产品名排序 array.sort((a,b) => a[0].localeCompare(b[0])) const result = [] let currentName = array[0][0] let currentSum = array[0][1] for(let i = 1; i < array.length; i++) { if(array[i][0] === currentName) { currentSum += array[i][1] } else { result.push([currentName, currentSum]) currentName = array[i][0] currentSum = array[i][1] } } // 把最后一组统计结果推入数组 result.push([currentName, currentSum])
内容的提问来源于stack exchange,提问作者Aryan
相关产品推荐
相关产品推荐

