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()方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章