【JavaScript】合并两组对象数组中有值的数据

JavaScript合并两组对象数组有值数据

场景需求

  • 合并两组数组中有值的数据
  • mc作为唯一标识,找到mc一样的数据匹配是否有值
// 最终处理结果
lastDataInfo(list1, list2) {
  const keysMc = Object.keys(list1);
  let list = {};
  for (let index = 0; index < keysMc.length; index++) {
    const key = keysMc[index];
    if (list2[key]) {
      list[key] = this.mergeDatasets(list1[key], list2[key]);
    } else {
      list[key] = list1[key];
    }
  }
  return list;
},
// 处理当事人代理人数据
mergeChildData(childA, childB) {
  const childMcMapA = {};
  const noMcChildA = [];
  const childMcMapB = {};
  const noMcChildB = [];
  childA.forEach(f => {
    if (f.mc) {
      childMcMapA[f.mc] = f;
    } else {
      noMcChildA.push(f);
    }
  });
  childB.forEach(f => {
    if (f.mc) {
      childMcMapB[f.mc] = f;
    } else {
      noMcChildB.push(f);
    }
  });
  const allChildMcs = new Set([...Object.keys(childMcMapA), ...Object.keys(childMcMapB)]);
  const mergedChilds = [];
  allChildMcs.forEach(name => {
      const childItemA = childMcMapA[name];
      const childItemB = childMcMapB[name];
      const mergedChild = {};
      const allKeys = new Set([...Object.keys(childItemA || {}), ...Object.keys(childItemB || {})]);
      allKeys.forEach(key => {
          mergedChild[key] = (childItemA && childItemA[key])? childItemA[key] : (childItemB && childItemB[key])? childItemB[key] : null;
      });
      mergedChilds.push(mergedChild);
  });
  mergedChilds.push(...noMcChildA,...noMcChildB);
  return mergedChilds;
},
// 合并对接当事人和要素当事人数据
mergeDatasets (datasetA, datasetB) {
  const mcMapA = {};
  const noMcA = [];
  const mcMapB = {};
  const noMcB = [];
  datasetA.forEach(item => {
    if (item.mc) {
      mcMapA[item.mc] = item;
    } else {
      noMcA.push(item);
    }
  });
  datasetB.forEach(item => {
    if (item.mc) {
      mcMapB[item.mc] = item;
    } else {
      noMcB.push(item);
    }
  });
  const allMcs = new Set([...Object.keys(mcMapA), ...Object.keys(mcMapB)]);
  const mergedDataset = [];
  allMcs.forEach(name => {
    const itemA = mcMapA[name];
    const itemB = mcMapB[name];
    const mergedItem = {};
    const allKeys = new Set([...Object.keys(itemA || {}), ...Object.keys(itemB || {})]);
    allKeys.forEach(key => {
      if (key === 'children') {
        mergedItem[key] = this.mergeChildData(itemA?.children || [], itemB?.children || []);
      } else {
        mergedItem[key] = (itemA && itemA[key])? itemA[key] : (itemB && itemB[key])? itemB[key] : null;
      }
    });
    mergedDataset.push(mergedItem);
  });
  mergedDataset.push(...noMcA,...noMcB);
  return mergedDataset;
},

使用

const list1 = {
  "中国人": [
     {
        "mc": "张三",
        "xb": "",
        "gj": "中国",
        "children": [
            {
                "mc": "李四",
                "xb": "女",
                "gj": ""
            }
        ]
     }
  ]
}
const list2 = {
  "中国人": [
    {
      "mc": "张三",
      "xb": "男",
      "gj": "",
      "children": [
          {
              "mc": "李四",
              "xb": "",
              "gj": "中国"
          }
      ]
    }
  ]
}
this.lastDataInfo(list1, list2);

输出

{
  "中国人": [
    {
      "mc": "张三",
      "xb": "男",
      "gj": "中国",
      "children": [
          {
              "mc": "李四",
              "xb": "女",
              "gj": "中国"
          }
      ]
    }
  ]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值