背景:是为了实现数据表里面的单页数据进行累加,但是并不是直接加,而是要在对象里面的多个字段值相同才能加到一组,并且还要预防后端返回数据为字符串或者为null的情况(自己也考虑了一下时间复杂度和空间复杂度)
没有考虑数组为无限层级的情况
思路:1、遍历目标数组
2、初始一个结果的空数组
3、在结果数组中找有没有具备条件的目标数组中的元素,找到并且存下当前结果数组的索引位置
4、如果没找到直接push到结果数组里面,找到了进行累加,当累加的值为空或者null默认为0,其他强制转number类型
5、返回结果
补充:因数据类型不规范可能导致累加数据出现字符串,所以需要先转number,转number某些数据类型可能会出问题,这里只考虑基本数据类型的情况
//arr目标数组
//keyArr筛选项数组(字符串组成的数组)
//figureArr计算项数组(字符串组成的数组)
//emptyArr置空项数组(字符串组成的数组)
//altContent替换某个属性的值
divideGroup(arr=[],keyArr=[],figureArr=[],emptyArr=[],altContent){
let results=[]
arr.forEach((item)=>{
let start=-1
let obj=results.find((ele,index)=>{
let flag=keyArr.every(content=>{
return ele[content]==item[content]
})
if(flag){
start=index
}
return flag
})
if(obj){
figureArr.forEach(val=>{
if(item[val]){
results[start][val]+=Number(item[val])
}
})
}else{
let o={
}
figureArr.forEach(key=>{
if(item[key]){
o[key]=Number(item[key])
}else{
o[key]=0
}
})
emptyArr.forEach(key=>{
item[key]=''
})
for(let key in altContent){
item[key]=altContent[key]
}
results.push(Object.assign({},item,o))
}
})
return results
},