在JavaScript中显示多维对象数组的结果

时间:2018-11-07 12:19:39

标签: javascript arrays object

我在Java语言方面经验不足,所以我需要您的帮助。 我有这样表示的多维对象数组:

arr = {
    "Ob1": {
        "id": 1,
        "name": "Ob1",
        "properties": {
            "attName": "A1",
            "attType": "string",
            "attOccurance": "minOccurs="1""
        },
        "Ob2": {
            "id": 101,
            "name": "Ob2",
            "properties": {
                "attName": "B1",
                "attType": "string",
                "attOccurance": "minOccurs="1""
                },
            "Ob3": {
                "id": 10001,
                "name": "Ob3",
                "properties": {
                    "attName": "C1",
                    "attType": "string",
                    "attOccurance": "minOccurs="1""
                    },
            },
            "Ob4": {
                "id": 10002,
                "name": "Ob4",
                "properties": {
                    "attName": "C2",
                    "attType": "string",
                    "attOccurance": "minOccurs="1""
                    },
            },
        },
        "Ob5": {
            "id": 102,
            "name": "Ob5",
            "properties": {
                "attName": "B2",
                "attType": "string",
                "attOccurance": "minOccurs="1""
            },
            "Ob6": {
                "id": 10003,
                "name": "Ob6",
                "properties": {
                    "attName": "C3",
                    "attType": "string",
                    "attOccurance": "minOccurs="1""
                },
            },
        },
    }
    "Ob7": {
        "id": 2,
        "name": "Ob7",
        "properties": {
            "attName": "A2",
            "attType": "string",
            "attOccurance": "minOccurs="1""
        },
    },
}

在必须返回2个级别(例如在这种情况下使用“ Ob7”)的情况下,如何在该数组中递归循环并显示结果,同时跟踪父对象?

结果必须以xml模式显示(如果一个对象有子对象为complexType,否则为simpleType:

<xs:complexType name="A1" type="string" minOccurs="1">
   <xs:complexType name="B1" type="string" minOccurs="1">
      <xs:simpleType name="C1" type="string" minOccurs="1"/>
      <xs:simpleType name="C2" type="string" minOccurs="1"/>
   </complexType>
   <xs:complexType name="B2" type="string" minOccurs="1">
      <xs:simpleType name="C3" type="string" minOccurs="1"/>
   </complexType>
</complexType>
<xs:simpleType name="A2" type="string" minOccurs="1"/>

此外,我不能将现有的库用于xml模式,必须在代码中完成映射。

我已经为递归尝试了类似的方法,但是它不起作用:

function looping(arr, key) {
    if( typeof(arr[key]) == "object" && Object.keys(arr).length >= 1 ) {
        val = arr[key];
        for( k in value ) {
            looping(arr[key], k);
        }
    } else {
        var temp = arr[key];
    }
}

for(key in arr) {
    looping( arr, key);
}

1 个答案:

答案 0 :(得分:1)

假设arr是一个对象数组,看起来像这样:

let arr = [
    {...},
    {...}
]

您需要编写一个函数,该函数将遍历数组中的每个对象并调用一个递归函数,该函数将检查对象是复杂对象还是简单对象。

如果它是复杂的对象,则应递归地为该对象再次调用该函数,如果没有返回简单对象,则为该对象。

您无需编写其他代码即可获得2个级别或类似的内容,递归过程将自然而然地到达那里。

我不确定您想要的输出是包含有效xml的字符串还是实际的xml对象,因此这是jsfiddle,它从您的示例中获取对象数组,将其转换为字符串,然后转换为xml对象使用DOMParser(假设您想在浏览器中运行此代码):

https://jsfiddle.net/tara5/qk79Lcaz/

检出浏览器控制台以查看输出。

您可以修改功能以获得所需的效果。