从类型为脚本的JSON获取嵌套对象中的子对象的父对象

时间:2017-07-03 16:32:14

标签: json angular typescript tree

是否可以动态地从子对象获取父对象?基本上,我试图完成的是动态检索属于子对象的属性的值。家长。例如,在下面的Json中,我想提取特定汽车的驱动程序:

   {
        "driver": [
            {
                "id": 1,       |
                "name": "Bob", |=> this is the parent
                "age": "34",   |
                "car": [
                    {
                        "make": "BMW",     |
                        "model": "3.20",   | this is the child
                        "colour": "Silver",|
                        "mileage": [
                            {
                                "total": "350523",
                                "year": [
                                    {
                                        "2011": "3535",
                                        "2012": "7852",
                                        "2013": "8045"
                                    }
                                ],
                                "month": [
                                    {
                                        "december": "966",
                                        "november": "546",
                                        "october": "7657"
                                    }
                                ]
                            }
                        ]
                    }
                ]
         }
        ]
    }

3 个答案:

答案 0 :(得分:1)

无论您选择何种策略,您都将基本上迭代并返回。所以我觉得"最好"策略是使用你最熟悉的。

Typescript只是Javascript。因此,如果您对Javascript-ey"功能性编程感到满意,那么#34;做事的方式你可以使用Array map&过滤

当然,您必须处理未指定的特定于应用程序的逻辑,并且#34;当不同驱动程序中存在相同的品牌/型号时会发生什么?"。

如果您对函数式编程不满意,可以随时构建一系列映射,然后执行查找。

但是如果你需要做对,那就做你觉得做得舒服的事。

答案 1 :(得分:0)

使用for循环:

for(let parent of data.driver) {
   for(let car of parent.car) {
      if(car.make === 'BMW') {
          // can do what you like with 'parent'
      }
   }
}

使用filter()find()(标准javascript):

drivers_who_drive_bwm = data.driver.filter((parent) => {
    // find() will give -1, if no car was found that matched 
    //    car.make === 'BWM'
    return parent['car'].find((car) => car.make === 'BWM') !== -1
})

此外:

您的命名惯例令人困惑。我希望driver.car成为一辆汽车,在你的代码中它是一系列汽车。如果它总是包含单个汽车,那么最好不要使用数组。 .driver也是如此。更好的密钥是.drivers来表示多个驱动程序。 (但也许它是XML转换为json,在这种情况下你会坚持下去吗?)

答案 2 :(得分:0)

要回答这个问题,Object引用只是一个内存位置。没有父母的概念来到这里。它可能没有任何父级(只是作为父级的逻辑思维,所以可能没有任何其他对象具有引用它的属性),或者许多对象可能引用相同的内存位置(即您的逻辑具有多个父级)。

1>因此,您可以通过programitically为每个子元素添加父引用。注意,这里你不能通过解析JSON字符串来做,因为它只包含JSON数据,而不是可解析的引用。

2 - ;或者尝试根据您的条件找出具有包含您的值的子对象的驱动程序对象(即父对象)。您可以在javascript中使用filtermap数组函数来执行此操作。但无论你在做什么,只是迭代并找到。在这种情况下underscrore js将是一个很好的库使用