今天看到一种数据处理需求是把购物单中的同名商品的数量合并,如下面的数据
let data2 = [{
id: "5",
name: "桃子",
num: 1,
},{
id: "1",
name: "苹果",
num: 1,
}, {
id: "2",
name: "苹果",
num: 1,
}, {
id: "3",
name: "梨",
num: 1,
}, {
id: "4",
name: "苹果",
num: 1,
}, {
id: "6",
name: "梨",
num: 7,
},{
id: "7",
name: "桃子",
num: 8,
}]
想得到这样的数据:
[{
id: '5',
name: '桃子',
num: 9
},{
id: '1',
name: '苹果',
num: 3
},{
id: '3',
name: '梨',
num: 8
}]
我是这样实现的:
- 思路大致是先创建一个空数组,然后循环原本的数组,去判断循环的item在新的数组有没有
- 若是没有则执行添加及合并操作,若是有则会被跳过
- 添加就是用push()填入新数组,合并就是再次循环数组去判断有无同名元素且索引不同,就把数量值合并
代码如下:
let data2 = [{
id: "5",
name: "桃子",
num: 1,
},{
id: "1",
name: "苹果",
num: 1,
}, {
id: "2",
name: "苹果",
num: 1,
}, {
id: "3",
name: "梨",
num: 1,
}, {
id: "4",
name: "苹果",
num: 1,
}, {
id: "6",
name: "梨",
num: 7,
},{
id: "7",
name: "桃子",
num: 8,
}]
// 创建新数组接收
let newdata = []
// 循环原本的数组
data2.forEach((item,index,arr)=>{
// 判断新数组中有没有当前元素item,没有的往下执行会添加
if(newdata.some((item2,index2)=>{
// newdata有一个同名就会反true
if(item.name == item2.name){
return true
}
})===false){ // 添加及合并操作:
// 将当前元素填入新数组中
newdata.push(item)
// 并且循环原本数组去判断当前元素item的其他同名元素,去合并
arr.forEach((item3,index3)=>{
// 如果有同名元素,但是索引不同,就把num合并
if(item.name == item3.name&&index!==index3){
// 同名元素在新数组中一定是最后一位
newdata[newdata.length-1].num += item3.num
}
})
// 因为每次循环会判断新数组是否有同名元素,所以后面的同名元素会跳过这部分操作
}
})
console.log(newdata)
看一下运行效果:
实现啦~