2016-01-21 30 views
1

另一個變量我有兩個變量array1array2如下,我想提出的array2值放入array1對存在於array1和休息的屬性應保持相同的屬性與默認值。變量的值設置爲相同的鍵

我的一個解決方案是遍歷數組長度併爲找到的屬性設置值,但是我的數組太長而無法執行迭代(在此問題中提供的數組只是一個原始值)。

我需要一些比迭代更好的方法。

var array1=[ 
    { 
     "name": "a", 
     "value": 0, 
     "level": [ 
      { 
       "name": "a1", 
       "value": 0 
      }, 
      { 
       "name": "a2", 
       "value": 0 
      } 
     ] 
    }, 
    { 
     "name": "b", 
     "value": 0, 
     "level": [ 
      { 
       "name": "b1", 
       "value": 0 
      }, 
      { 
       "name": "b2", 
       "value": 0 
      } 
     ] 
    }, 
    { 
     "name": "c", 
     "value": 0, 
     "level": [ 
      { 
       "name": "c1", 
       "value": 0 
      }, 
      { 
       "name": "c2", 
       "value": 0 
      } 
     ] 
    } 
] 



var array2=[ 
    { 
     "name": "a", 
     "value": 1, 
     "level": [ 
      { 
       "name": "a1", 
       "value": 1 
      }, 
      { 
       "name": "a2", 
       "value": 0 
      } 
     ] 
    }, 
    { 
     "name": "b", 
     "value": 1, 
     "level": [ 
      { 
       "name": "b1", 
       "value": 0 
      }, 
      { 
       "name": "b2", 
       "value": 1 
      } 
     ] 
    }  
] 

和所需的輸出是

var final_array=[ 
    { 
     "name": "a", 
     "value": 1, 
     "level": [ 
      { 
       "name": "a1", 
       "value": 1 
      }, 
      { 
       "name": "a2", 
       "value": 0 
      } 
     ] 
    }, 
    { 
     "name": "b", 
     "value": 1, 
     "level": [ 
      { 
       "name": "b1", 
       "value": 0 
      }, 
      { 
       "name": "b2", 
       "value": 1 
      } 
     ] 
    }, 
    { 
     "name": "c", 
     "value": 0, 
     "level": [ 
      { 
       "name": "c1", 
       "value": 0 
      }, 
      { 
       "name": "c2", 
       "value": 0 
      } 
     ] 
    } 
] 
+0

您正在使用哪個角版本? – maurycy

+2

@maurycy angular沒有被提及,也不是唯一一個使用「extend」方法的庫 – Rhumborl

+0

這兩個數組之間的區別究竟是什麼? – Liam

回答

0

與兩個迭代,一個用於陣列iterateA和一個用於對象iterateO遞歸溶液。本提案使用thisArg作爲參考json2

基本上這兩個回調都會遍歷項目或密鑰,並檢查是否設置了this並且實際項目是否存在於this中。如果沒有,該函數返回。

剩下的是直截了當的,如果找到一個對象,那麼它遍歷鍵和對象,如果找到一個數組,它遍歷數組。

只有在k === 'value'的情況下this[k]的值爲o[k]賦值。

var json1 = [{ "name": "a", "value": 0, "level": [{ "name": "a1", "value": 0 }, { "name": "a2", "value": 0 }] }, { "name": "b", "value": 0, "level": [{ "name": "b1", "value": 0 }, { "name": "b2", "value": 0 }] }, { "name": "c", "value": 0, "level": [{ "name": "c1", "value": 0 }, { "name": "c2", "value": 0 }] }], 
 
    json2 = [{ "name": "a", "value": 1, "level": [{ "name": "a1", "value": 1 }, { "name": "a2", "value": 0 }] }, { "name": "b", "value": 1, "level": [{ "name": "b1", "value": 0 }, { "name": "b2", "value": 1 }] }]; 
 

 
function iterateO(o) { 
 
    return function (k) { 
 
     if (!this || !(k in this)) { 
 
      return; 
 
     } 
 
     if (typeof o[k] === 'object') { 
 
      Object.keys(o[k]).forEach(iterateO(o[k]), this[k]); 
 
      return; 
 
     } 
 
     if (Array.isArray(o[k])) { 
 
      o[k].forEach(iterateA, this[k]); 
 
      return; 
 
     } 
 
     if (k === 'value') { 
 
      o[k] = this[k]; 
 
     } 
 
    }; 
 
} 
 

 
function iterateA(a, i, aa) { 
 
    if (!this || !(i in this)) { 
 
     return; 
 
    } 
 
    if (typeof a === 'object') { 
 
     Object.keys(a).forEach(iterateO(a), this[i]); 
 
     return; 
 
    } 
 
    if (Array.isArray(a)) { 
 
     a.forEach(iterateA, this[i]); 
 
     return; 
 
    } 
 
} 
 

 
json1.forEach(iterateA, json2); 
 
document.write('<pre>' + JSON.stringify(json1, 0, 4) + '</pre>');