JS实现将两个相同的json对象合并成为一个新对象(对象中包含list或者其他对象)source===>>>target(不破坏target的非空值)

重点申明一下, 这个方法 只限于两个完全一样的对象 ,不一样的对象请使用 下面的进行合并,

 

<script>
    let form = {name: 'liming', sex: '男'};
    let obj = {class: '一班', age: 15};
    console.log('before', form);
    Object.assign(form, obj); //该方法可以完成
    console.log('after', form);
</script>

 

话不多说, js基础比较差, 所以记录一下

使用递归的思想进行合并,

/**
   * 一个json对象 中可以有 jsonObject 也可以有 sonArray
   * 该方法最终将sourceJson 与targetJson 合并, 最终以target为主体,限于两个相同对象 ,不同对象用OBject.ass...
   * 例如: sA={a:null,b:2,c:3}; tA={a:11,b:null,c:33};  得到{a:11,b:2,c:33}
   * @param sourceJson
   * @param targetJson
   */
  function merge2(sourceJson, targetJson) {
    var resultJson = {};
    resultJson = targetJson;
      for (var sattr in sourceJson) {
        for (var tattr in targetJson) {

          if (sattr.toString() == tattr.toString()) {

            var sourceStr = JSON.stringify(sourceJson[sattr]);
            var targetStr = JSON.stringify(targetJson[tattr]);
            // 只需判断source即可, target即便有值, 递归过程中也不会覆盖
            if (sourceStr.lastIndexOf('}') > 0 && sourceJson[sattr].constructor == Object) {
              // 如果该属性下还有对象, 那就递归合并,直到该属性不为对象,最终修改结果为target
              merge2(sourceJson[sattr], targetJson[tattr]);
            }
            //如果是 jsonarray
            if (sourceStr.lastIndexOf(']') > 0 && sourceJson[sattr].constructor == Array) {
              for (var i = 0; i < sourceJson[sattr].length; i++) {
                if (targetJson[tattr] == null) {
                  // 假如目标此属性null ,直接全部赋值,跳出循环
                  targetJson[tattr] = sourceJson[sattr];
                  break;
                }
                merge2(sourceJson[sattr][i], targetJson[tattr][i]);
              }
            }
            if (targetJson[tattr]==null){
            // 假如 target目标该属性为空,直接赋值,无需判断源是否null,反正都是null
              targetJson[tattr] = sourceJson[sattr];
            //该属性做完更改之后就break,省去其他循环
            break;
            }
          }
        }
      }
    return targetJson;
  }

里面都有注释, 大家不明白的直接回复我, 我看到第一时间就会回复你. 

谢谢,你我共勉

 

如果是java的就不用我说了, spring有一个BeanUtils, 里面有一个copyProperties()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值