JS数组对象,去重并把相同项的值合并相加

数组结构如图:

   "data": [
        {
            "workshop_name": "准特公司-冷氢化车间",
            "alarmType": "安环",
            "groupName": "四班",
            "workshop": "10005552",
            "groupId": "571254157697280261",
            "IIIAlarmCount": 0,
            "allCount": 30,
            "IIAlarmCount": 14,
            "base": "准特公司",
            "IAlarmCount": 16
        },
        {
            "workshop_name": "准特公司-冷氢化车间",
            "alarmType": "安环",
            "groupName": "一班",
            "workshop": "10005552",
            "groupId": "571253955787680005",
            "IIIAlarmCount": 0,
            "allCount": 1,
            "IIAlarmCount": 1,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-冷氢化车间",
            "alarmType": "工艺",
            "groupName": "二班",
            "workshop": "10005552",
            "groupId": "571254025643813125",
            "IIIAlarmCount": 5,
            "allCount": 5,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-冷氢化车间",
            "alarmType": "工艺",
            "groupName": "四班",
            "workshop": "10005552",
            "groupId": "571254157697280261",
            "IIIAlarmCount": 4,
            "allCount": 4,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-原料车间",
            "alarmType": "工艺",
            "groupName": "三班",
            "workshop": "10005553",
            "groupId": "571258982400977157",
            "IIIAlarmCount": 67,
            "allCount": 68,
            "IIAlarmCount": 1,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-原料车间",
            "alarmType": "工艺",
            "groupName": "一班",
            "workshop": "10005553",
            "groupId": "571258836783130885",
            "IIIAlarmCount": 28,
            "allCount": 28,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-辅助车间",
            "alarmType": "工艺",
            "groupName": "一班",
            "workshop": "10005556",
            "groupId": "571252407380666629",
            "IIIAlarmCount": 2,
            "allCount": 2,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-还原车间",
            "alarmType": "工艺",
            "groupName": "五班",
            "workshop": "10005554",
            "groupId": "571259527790520581",
            "IIIAlarmCount": 19,
            "allCount": 19,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "准特公司-还原车间",
            "alarmType": "工艺",
            "groupName": "四班",
            "workshop": "10005554",
            "groupId": "571258581501012229",
            "IIIAlarmCount": 1,
            "allCount": 1,
            "IIAlarmCount": 0,
            "base": "准特公司",
            "IAlarmCount": 0
        },
        {
            "workshop_name": "全部合计",
            "alarmType": "",
            "workshop": "",
            "IIIAlarmCount": 126,
            "allCount": 158,
            "IIAlarmCount": 16,
            "IAlarmCount": 16,
            "base": "全部"
        }
    ]

需求:接口返回的数据workshop_name相同的要去重并把数量相加(allCount、IAlarmCount、IIAlarmCount、IIIAlarmCount)这四个字段要累计求和

思路:这里可以定义俩个空数组,一个用来存储workshop_name,一个存储最终结果,代码如下:

     let idArr = []; //相同id放在同一数组中
      let resultArr = []; //最终结果数组
      // list是后台接口返回的数据(格式是数组对象)
      for (let i = 0; i < list.length; i++) {
        let index = idArr.indexOf(list[i].workshop); /* indexOf方法:查找数组里有没有对应的字段,返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。 */
        if (index > -1) {
          //有相同id存在的话,获取index索引位置
          resultArr[index].allCount += Number(list[i].allCount); //取相同workshop的allCount累加
          resultArr[index].IAlarmCount += Number(list[i].IAlarmCount); //取相同workshop的IAlarmCount累加
          resultArr[index].IIAlarmCount += Number(list[i].IIAlarmCount); //取相同workshop的IIAlarmCount累加
          resultArr[index].IIIAlarmCount += Number(list[i].IIIAlarmCount); //取相同workshop的IIIAlarmCount累加
        } else {
          idArr.push(list[i].workshop);/* 存放workshop */
          resultArr.push(list[i]);
        }
      }

最终返回结果

JavaScript 中,将两个数组相加合并得到一个新的数组可以通过多种方式实现。具体取决于数组的结构以及是否需要对相同位置的元素进行相加。 ### 依次相加两个数组的元素 如果两个数组的长度相同且希望将它们对应位置的元素相加,可以使用 `Array.map()` 方法配合索引来实现。该方法会创建一个新的数组,其中的每个元素是两个数组相同索引位置的元素之和。 ```javascript function addArrays(array1, array2) { return array1.map((value, index) => value + array2[index]); } const array1 = [1, 2, 3]; const array2 = [4, 5, 6]; console.log(addArrays(array1, array2)); // 输出: [5, 7, 9] ``` 此方法适用于两个数组长度相同的情况,且能够高效地生成一个新的数组,其中每个元素是两个数组中对应元素的和 [^1]。 ### 合并两个数组删除 如果目标是合并两个数组,可以使用 `Set` 来确保最终数组中的元素是唯一的。`Set` 是一种集合数据结构,不允许。通过将两个数组连接后传入 `Set`,可以快速实现。 ```javascript const array1 = [1, 2, 3]; const array2 = [3, 4, 5]; const mergedArray = [...new Set([...array1, ...array2])]; console.log(mergedArray); // 输出: [1, 2, 3, 4, 5] ``` 此方法保留了原始数组的顺序,确保最终数组中的元素是唯一的 [^2]。 ### 合并两个数组保留所有元素 如果不需要,只需要将两个数组中的所有元素合并到一个新的数组中,可以使用扩展运算符(`...`)或 `Array.concat()` 方法。 ```javascript const array1 = [1, 2, 3]; const array2 = [4, 5, 6]; const mergedArray = [...array1, ...array2]; console.log(mergedArray); // 输出: [1, 2, 3, 4, 5, 6] ``` 通过扩展运算符,可以轻松地将多个数组合并成一个新的数组,同时保留所有元素 [^3]。 ### 使用 Lodash 合并对象数组求和 如果数组中包含的是对象且希望根据某个字段(如 `id`)合并数组对其他字段(如 `quantity`)进行求和,可以使用 Lodash 库的 `_.reduce()` 方法来实现。 ```javascript const _ = require('lodash'); const array1 = [{ id: 1, quantity: 10 }, { id: 2, quantity: 20 }]; const array2 = [{ id: 1, quantity: 5 }, { id: 3, quantity: 15 }]; const mergedArray = Object.values([...array1, ...array2].reduce((acc, item) => { if (acc[item.id]) { acc[item.id].quantity += item.quantity; } else { acc[item.id] = { ...item }; } return acc; }, {})); console.log(mergedArray); // 输出: [ { id: 1, quantity: 15 }, { id: 2, quantity: 20 }, { id: 3, quantity: 15 } ] ``` 此方法通过 `reduce()` 创建一个中间对象,根据 `id` 累加 `quantity`,最终通过 `Object.values()` 转换为数组 [^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值