大学解惑03 - 数组内包含多个name和count的对象元素,name去重,并且count累加

        题目大致是一个数组,内部元素是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);

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值