【问题标题】:Put object properties inside of another object将对象属性放在另一个对象内
【发布时间】:2016-03-14 20:31:04
【问题描述】:

这可能很简单,但我似乎找不到如何在 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-repeat 内执行 ng-repeat,因此我制作了第一个 JSON 对象的某种树。最低层(有时 5 层)必须包含数据和年份,所以我试图弄清楚如何合并这些多维数组/对象。

在我看来,最好的办法是拥有这样的东西:

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

在我看来,发布它仍然很困难,但我认为如果我的对象/数组看起来像这样,我会更进一步。

【问题讨论】:

    标签: javascript arrays angularjs object


    【解决方案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);
    }
    

    【讨论】:

    • 嗨@Molda 它有效!非常感谢你。我只是每天看到这么多代码,有时我似乎无法找到正确的方法来完成这些简单的事情......
    • 嗨 Molda,我不知道是否有办法,您可以将上面的代码更新到我有的情况,例如obj1 中的 3000 条记录和 obj2 中的相同数量?现在遍历所有记录需要花费大量时间。
    • 您真的需要在客户端处理这么多数据吗?我无法想象我需要它的情况。如果您可以更详细地解释您在何处以及如何获取数据,那么您的问题可能会有不同的解决方案。我认为没有办法使用这么多数据来提高性能。
    • 我会做的,我从 2 个不同的地方获取数据。 1. PostgreSQL 数据库,我使用 PHP 类读取行并将其转换为 PHP 本身的对象。 2. 通过 websocket 连接到 API。在这里我得到了相同数量的数据,但我不确定(API 发送对象本身)我不能排除这两种不同的获取数据的方式。
    • 感觉像是糟糕的设计。您不能使用一些过滤器一次获取更少的数据并使用分页显示每页最多 100 行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多