JS 对象数组将某些相同属性值合并,其他属性累积

该博客介绍了一个JavaScript方法,用于根据多个相同属性合并对象数组。递归函数遍历数组,比较对象属性,找到匹配项并整合到新对象中,同时从原始数组中移除已处理的元素,直至数组为空。示例展示了如何处理具有相同前9项的数组对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:某个对象数组,将其某些属性值相同的对象拿到,然后合并这些对象

举例:有一个数组,其2,3项前9项相同,可以合并。

let excelData = {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D22030721",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 1,
          "人才满足策略": "外部招募",
          "行动计划": "测试1",
          "预计完成时间": 44844,
          "pic": "测试1",
          "本月进度说明": "测试1",
          "实际完成时间": 44844
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D20070049",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 2,
          "人才满足策略": "外部招募",
          "行动计划": "测试11",
          "预计完成时间": 44845,
          "pic": "测试11",
          "本月进度说明": "测试11",
          "实际完成时间": 44845
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D20070049",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 2,
          "人才满足策略": "外部招募",
          "行动计划": "测试111",
          "预计完成时间": 44844,
          "pic": "测试111",
          "本月进度说明": "测试111",
          "实际完成时间": 44844
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D21051113",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 1,
          "接班顺序(0:无,1~N)": 1,
          "人才满足策略": "外部招募",
          "行动计划": "应该无",
          "预计完成时间": 44844,
          "pic": "应该无",
          "本月进度说明": "应该无",
          "实际完成时间": 44844
      }
      ]

方法:使用递归实现

/**
 * 对象数组根据多个相同的属性进行合并
 * 原理:每次将arr[0]中需要比较相同的属性存入temp,循环arr找出与arr[0]具有相同属性的对象,
 * 并push到result中,同时记录相同项的索引,再将arr中改索引的数据删除,以达到去除比对过相同的数据防止多次比对。
 * 再次调用本方法,直到arr被删除完,即比对结束,最后返回result
 * @param {Array} arr 需要合并数组
 * @param {Array} result 返回合并数组
 * @return result 返回合并数组
 */
digui(arr,result){
  if(arr.length > 0){//判断arr是否海油值
    let temp = {//存放基本数据,定义strategyInfo[]存放不同的属性组成的对象
      departmentCode:arr[0]['部门代码'],
      departmentLevel:arr[0]['岗位层级'],
      neck:arr[0]['与上级组织关系(0:一般,1:挂脖子)'],
      stationName:arr[0]['岗位名称'],
      departmentManagerEmplid:arr[0]['在岗人员工号'],
      successorEmplid:arr[0]['接班人工号'],
      successionState:arr[0]['接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)'],
      successionOrder:arr[0]['接班顺序(0:无,1~N)'], 
      strategyInfo:[]
    }
    let indexs = []
    for (let i = 0; i < arr.length; i++) {
      if(temp.departmentCode  ==  arr[i]['部门代码']&&//比较需要相同的属性
         temp.departmentLevel  ==  arr[i]['岗位层级']&&
         temp.neck  ==  arr[i]['与上级组织关系(0:一般,1:挂脖子)']&&
         temp.stationName  ==  arr[i]['岗位名称']&&
         temp.departmentManagerEmplid  ==  arr[i]['在岗人员工号']&&
         temp.successorEmplid  ==  arr[i]['接班人工号']&&
         temp.successionState  ==  arr[i]['接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)']&&
         temp.successionOrder == arr[i]['接班顺序(0:无,1~N)']
        ){
        temp['strategyInfo'].push({//如果满足以上属性相同,则将其他属性装成对象push到准备好数组strategyInfo中
          departmentLevel:arr[i]['岗位层级'],
          stationName:arr[i]['岗位名称'],
          departmentCode:arr[i]['部门代码'],
          type:2,
          withoutId:'',
          strategy:arr[i]['人才满足策略'],
          plan:arr[i]['行动计划'],
          estimateTime:arr[i]['预计完成时间'],
          pic:arr[i]['pic'],
          monthlyProgressReport:arr[i]['本月进度说明'],
          actualTime:
            (Object.prototype.hasOwnProperty.call(arr[i], '实际完成时间'))?
            arr[i]['实际完成时间']:'',
        })
        //记录满足条件的索引,使用unshift不用push(删除时可以从后往前,防止删除前面的引起后面的索引与数据对不上)
        indexs.unshift(i)
      }
    }
    //循环删除满足条件的数据(如果上面使用push,这里需要倒序删除)
    for (let j = 0; j <indexs.length ; j++) {
      arr.splice(indexs[j],1)
    }
    result.push(temp)//将整理好的一项数据push到result
    console.log('indexs',indexs);
    console.log('result',result);
    this.digui(arr,result)//递归调用,传入处理过的arr和有部分数据的result
  }
  return result//当arr不>0,即被删完时,说明所有数据都比对完成,此时返回result
},

let excelData = [
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D22030721",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 1,
          "人才满足策略": "外部招募",
          "行动计划": "测试1",
          "预计完成时间": 44844,
          "pic": "测试1",
          "本月进度说明": "测试1",
          "实际完成时间": 44844
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D20070049",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 2,
          "人才满足策略": "外部招募",
          "行动计划": "测试11",
          "预计完成时间": 44845,
          "pic": "测试11",
          "本月进度说明": "测试11",
          "实际完成时间": 44845
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D20070049",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 3,
          "接班顺序(0:无,1~N)": 2,
          "人才满足策略": "外部招募",
          "行动计划": "测试111",
          "预计完成时间": 44844,
          "pic": "测试111",
          "本月进度说明": "测试111",
          "实际完成时间": 44844
      },
      {
          "部门代码": "KDLP10",
          "岗位层级": "非課級",
          "与上级组织关系(0:一般,1:挂脖子)": 0,
          "岗位名称": "前端",
          "在岗人员工号": "D14080045",
          "副手工号": "D22070528",
          "接班人工号": "D21051113",
          "接班状态(0:无,1:立即接班,2:1-2年接班,3:2年后接班)": 1,
          "接班顺序(0:无,1~N)": 1,
          "人才满足策略": "外部招募",
          "行动计划": "应该无",
          "预计完成时间": 44844,
          "pic": "应该无",
          "本月进度说明": "应该无",
          "实际完成时间": 44844
      }
      ]
let arr = JSON.parse(JSON.stringify(excelData))
console.log('excelData',excelData);
let result = this.digui(arr,[])
console.log('result',result);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值