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

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