2016-01-21 114 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>');