题目大致是一个数组,内部元素是N个对象,对象内包含name和count属性,例如以下代码,代码中每个对象元素中都包含name属性和count属性,而name属性是可重复的,可能会是n个,count是数值型。
像不像小时候老师计算,1班男生20个,1班男生20个,2班。。。。。。
let arr = [ {name: 'name1', count: 1}, {name: 'name1', count: 3}, {name: 'name2', count: 1}, {name: 'name2', count: 3}, {name: 'name2', count: 4}, {name: 'name3', count: 4}, {name: 'name3', count: 1}, {name: 'name3', count: 9}, ]
最终的结果是希望,arr数组中这些元素,可以实现name属性的过滤去重,并且去重过程中name值合并,并且count值累加。
累加的结果就像小时候校长来了,也开始计算,1班学生40个,2班学习42个,3班。。。。。。
let arr2 = [ {name: 'name1', count: 4}, {name: 'name2', count: 8}, {name: 'name3', count: 14}, ]
这道题的示例内容较少,你当然可以把这道题看成是一道口算题,但如果数组内的元素更多了呢,多到看不过来,恐怕口算难以支撑结果的实现了。
1、定义新变量
定义一个新对象,变量newArr ,新对象用来去重,利用对象的key值唯一的原理(先不考虑symbol这个新的数据类型);
定义一个新数组,变量newArr, 新数组用来做什么?用来装去重后的新内容,而不是在原数组做污染,避免越弄越乱。
let newArr = [];
let newObj = {};
for (let i=0;i<arr.length;i++) {
// 如果对象里有这个name1,就将值累加
if (newObj[arr[i]['name']]) {
let oldCount = newObj[arr[i]['name']]['count'];
let newCount = arr[i]['count'];
newObj[arr[i]['name']] = {name: arr[i]['name'], count: oldCount + newCount}
} else { // 如果对象里没有这个name1 就创建
newObj[arr[i]['name']] = {name: arr[i]['name'], count: arr[i]['count']};
}
}
console.log(newObj);
这一步的逻辑呢就是先定义一个空对象,对象的key值是唯一的,所以当我们判断对象里的name属性为空,那么就给对象新创建一个key值,而这个key值就是数组子元素的name值,而一旦判断对象中有整个key值了,证明至少已经有了一次count值了,这个时候再去给这个唯一的name元素累加即可。
这个时候得到的是一个新的newObj,已经实现了name值去重,count累加,但是这还是一个object,而不是一个数组,下一步就是转换。
2、转换
上一步得到了一个去重后的对象,并且已经将count值做了累加,但要求的是一个数组。还记得第一步预设定了一个变量 newArr,我们将newObj装进来就可以了
for (let key in newObj) {
newArr.push(newObj[key]);
}
console.log(newArr);