首页 > 解决方案 > 使用缩进 JavaScript 构建显示

问题描述

我有如下所示的输入对象:

 myObj = {
        "Ob1": {
            "myObjName": "A1",
            "myObjType": "string",
            "myObjOcc": "minOccurs="1""
            "Ob2": {
                "myObjName": "B1",
                "myObjType": "string",
                "myObjOcc": "minOccurs="1""
                "Ob3": {
                    "myObjName": "C1",
                    "myObjType": "string",
                    "myObjOcc": "minOccurs="1""
                } 
            }
         }
         "Ob4": {
                    "myObjName": "A2",
                    "myObjType": "string",
                    "myObjOcc": "minOccurs="1""
         }
    }

而且我必须以 xml 模式方式显示对象:

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

这个想法是,如果一个对象有子对象,那么它就是一个复杂类型,如果没有,它就是一个简单类型。

我有这段代码正在打印,但如果有人可以帮助我用缩进构造它:

    function isNestedObject(obj) {
        for (var o in obj) {
            if (isComplexType(o, obj)) {
                return true;
            }
        }
    }

    function isComplexType(key, obj) {
        return (typeof obj[key] === "object");
    }

    function xsdStructure(obj) {
        var str = "",
            properties = obj.properties;              

        if (isNestedObject(obj)) {
            if (obj instanceof Array) {
                for(var o in obj) {
                    xsdStructure(obj[o]);
                }
            }
            str += "<xs:complexType name=\"" + obj.attrName + "\" type=\"" + obj.type + "\" " + obj.multiplicty + ">\n";
            for (var key in obj) {
                var arr = obj[key];
                if (arr instanceof Array) {
                    for (var a in arr) {
                        str += xsdStructure(arr[a]);
                    }
                }
            } 
            str += "</xs:complexType>\n"
        } else {
            str = "<xs:simpleType name=\"" + obj.attrName + "\" type=\"" + obj.type + "\" " + obj.multiplicty + "/>\n";
        }

        return str;
     }

     function printing(myObj) {
        var result = "";
        for (var key in object) {
            result += xsdStructure(object[key]);
        }
        result = '<xs:schema>\n' 
                        + result 
                    + '</xs:schema>';

        return result;
     }

它假设看起来像上面的 xml 模式,但我不能使用 DOMParser 所以它必须手动完成。

提前致谢

标签: javascriptnestedindentation

解决方案


我为你准备了小提琴。我有几件事要跟你说。首先,您应该在所有与初始对象一起使用的函数中使用相同的 attrs 名称。例如: str += "<xs:complexType name=\"" + obj.myObjName + "\" type=\"" + obj.myObjType + "\" " + obj.myObjOcc + ">\n";而不是你的,str += "<xs:complexType name=\"" + obj.attrName + "\" type=\"" + obj.type + "\" " + obj.multiplicty + ">\n";你也永远不会得到这个条件if (obj instanceof Array),因为你的 obj 根本不包含数组。


推荐阅读