2016-03-14 61 views
1

这可能是很容易的,但我似乎无法找到如何在Javascript把对象属性

合并2个对象

例如:对象一个

[ 
    { 
    "name":"Actief", 
    "children":[ 
     { 
     "name": "Vaste activa", 
     "children": [ 
      { 
      "name": "Immateriële vaste activa", 
      "children": null 
      }, 
      { 
      "name": "Materiële vaste activa", 
      "children": [ 
       { 
       "name": "Terreinen en gebrouwen", 
       "children": null 
       }, 
       { 
       "name": "Installaties, machines & uitrustingen", 
       "children": null 
       }, 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

对象二:

[ 
    { 
     name: "Immateriële vaste activa", 
     data: [1.3, 2.4, 3.6, 0.2, 1.1], 
     year: [2009, 2010, 2011, 2012, 2013] 
    }, 
    { 
     name: "Terreinen en gebrouwen", 
     data: [1000300, 44589, 908887, 255667, 110000], 
     year: [2009, 2010, 2011, 2012, 2013] 
    }, 
    { 
     name: "Installaties, machines & uitrustingen", 
     data: [12000, 23000, 38000, 203000, 11111], 
     year: [2009, 2010, 2011, 2012, 2013] 
    } 
] 

于是解释这多一点点,我建立一个AngularJS应用,其中在这个例子中,我做ng-repeatng-repeat里面,所以我做一些作者第一个JSON对象的树。最低级别(有时是5级)必须包含数据和年限,所以我试图弄清楚如何合并这些多维数组/对象。

最好的将是,我oppinion,是有这样的事情:

{ 
    "name": "Terreinen en gebrouwen", 
    "children": null, 
    "data": [1000300, 44589, 908887, 255667, 110000], 
    "year": [2009, 2010, 2011, 2012, 2013] 
}, 

它仍然将很难在我看来,发布这一点,但我想我会是一个很大的一步,如果我的对象/数组看起来像这样。

回答

1

这看起来相当简单。

所有你需要的是遍历对象的两个的项目,然后找到具有相同名称的对象在对象一个

我们的两个对象:

var obj1 = [ 
    { 
    "name":"Actief", 
    "children":[ 
     { 
     "name": "Vaste activa", 
     "children": [ 
      { 
      "name": "Immateriële vaste activa", 
      "children": null 
      }, 
      { 
      "name": "Materiële vaste activa", 
      "children": [ 
       { 
       "name": "Terreinen en gebrouwen", 
       "children": null 
       }, 
       { 
       "name": "Installaties, machines & uitrustingen", 
       "children": null 
       }, 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

var obj2 = [ 
    { 
     name: "Immateriële vaste activa", 
     data: [1.3, 2.4, 3.6, 0.2, 1.1], 
     year: [2009, 2010, 2011, 2012, 2013] 
    }, 
    { 
     name: "Terreinen en gebrouwen", 
     data: [1000300, 44589, 908887, 255667, 110000], 
     year: [2009, 2010, 2011, 2012, 2013] 
    }, 
    { 
     name: "Installaties, machines & uitrustingen", 
     data: [12000, 23000, 38000, 203000, 11111], 
     year: [2009, 2010, 2011, 2012, 2013] 
    } 
] 

那么函数如果名称相同,则添加属性,或者如果有任何内容,请进入儿童阵列并重试:

function addProps(obj, o){ 

     for (var j = 0; j < obj.length; j++) { 
      var o2 = obj[j]; 
      if(o2.name === o.name) { 
       o2.data = o.data; 
       o2.year = o.year; 
      } else { 
       if(o2.children != null) addProps(o2.children, o); 
      } 
     } 

} 

现在遍历对象在我的两个代码obj2

for (var i = 0; i < obj2.length; i++) { 
    var o = obj2[i]; 
    addProps(obj1, o); 
} 
+0

嗨@Molda它的作品!非常感谢你。我只是看到这么多的代码,有时我似乎无法找到正确的方法来完成这样简单的事情... – Peter

+0

嗨Molda,我不知道是否存在一种方法,你可以更新上面的代码我有例如的情况obj1中的3000条记录和obj2中的相同数量?现在迭代所有记录需要很多时间。 – Peter

+0

你真的需要在客户端处理这些数据吗?当我需要时,我无法想象一种情况。如果你可以更详细地解释你在哪里以及如何获得数据,那么你的问题可能会有不同的解决方案。我认为没有办法通过大量数据提高性能。 – Molda