如何在javascript中制作递归嵌套数组?

时间:2018-06-03 13:54:07

标签: javascript arrays recursion

以下是我所拥有的json:

{
    "name": "test",
    "characteristics": [
        {
            "name": "A",
            "description": "",
            "comprisedOf": [
                {
                    "name": "A1",
                    "description": "",
                    "comprisedOf": [
                        {
                            "name": "A1.1",
                            "description": "",
                            "value": "10"
                        },
                        {
                            "name": "A1.2",
                            "description": "",
                            "value": "5"
                        }
                    ]
                },
                {
                    "name": "A2",
                    "description": "",
                    "value": "100"
                },
                {
                    "name": "A3",
                    "description": "",
                    "value": "20"
                },
                {
                    "name": "A4",
                    "description": "",
                    "value": "50"
                }
            ]
        },
        {
            "name": "B",
            "description": "",
            "value": "10"
        }
    ]
}

这里我有2个特征对象" test" - A和B.这2个对象可能有也可能没有"包含"阵列。对于例如,A有"包括"数组而B没有。这些包含的数组还可以包含或不包含对象数组。

现在我必须制作一个数组,它应该像下面给出的数组一样: -

[
    {
        "name": "test",
        "children": [
            {
                "name": "A",
                "children": [
                    {
                        "name":"A1",
                        "children:: [
                            {
                                "name":  "A1.1"
                            },
                            {
                                "name": "A1.2"
                            }
                        ]
                    },
                    {
                        "name": "A2"
                    },
                    {
                        "name": "A3"
                    },
                    {
                        "name": "A4"
                    }
                ]
            },
            {
                "name": "B"
            }
        ]
    }
]

如何以递归方式从第一个数组中形成此数组?

非常感谢!!

编辑: - 这是我尝试过的: -

var makeChildrenAll = function(dataChar){
    dataChar.forEach(function(char){
        if(char.comprisedOf) {
            makeChildrenAll(char.comprisedOf);                                
        }
        childrenData.push({
            name: char.name,
            description: char.description,
           children: childrenData
        });
    });
};
makeChildrenAll(dataChar);

2 个答案:

答案 0 :(得分:2)

为了递归,你希望函数返回并能够将返回值分配给当前对象

这样的东西



function mapItems(arr){
   // return new array
   return arr.reduce((a,c)=>{
     var newObj={name:c.name};
     if(Array.isArray(c.comprisedOf)){
        // use returned array of recursive function to assign to `children` property
        newObj.children = mapItems(c.comprisedOf)
     }
     return a.concat(newObj)
   },[])
}

console.log(mapItems(data.characteristics))

.as-console-wrapper {	max-height: 100%!important;}

<script>
var data ={
    "name": "test",
    "characteristics": [
        {
            "name": "A",
            "description": "",
            "comprisedOf": [
                {
                    "name": "A1",
                    "description": "",
                    "comprisedOf": [
                        {
                            "name": "A1.1",
                            "description": "",
                            "value": "10"
                        },
                        {
                            "name": "A1.2",
                            "description": "",
                            "value": "5"
                        }
                    ]
                },
                {
                    "name": "A2",
                    "description": "",
                    "value": "100"
                },
                {
                    "name": "A3",
                    "description": "",
                    "value": "20"
                },
                {
                    "name": "A4",
                    "description": "",
                    "value": "50"
                }
            ]
        },
        {
            "name": "B",
            "description": "",
            "value": "10"
        }
    ]
}
</script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用不同的启动数组并对所需属性使用解构。

&#13;
&#13;
function mapItems(array) {
    return array.map(({ name, comprisedOf }) =>
        Object.assign({ name }, comprisedOf && { children: mapItems(comprisedOf) }));
}

var data = { name: "test", characteristics: [{ name: "A", description: "", comprisedOf: [{ name: "A1", description: "", comprisedOf: [{ name: "A1.1", description: "", value: "10" }, { name: "A1.2", description: "", value: "5" }] }, { name: "A2", description: "", value: "100" }, { name: "A3", description: "", value: "20" }, { name: "A4", description: "", value: "50" }] }, { name: "B", description: "", value: "10" }] };

console.log(mapItems([{ name: data.name, comprisedOf: data.characteristics }]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

ES5

&#13;
&#13;
function mapItems(array) {
    return array.map(function (o) {
        var r = { name: o.name };
        if (o.comprisedOf) {
            r.children = mapItems(o.comprisedOf);
        }
        return r;
    });
}

var data = { name: "test", characteristics: [{ name: "A", description: "", comprisedOf: [{ name: "A1", description: "", comprisedOf: [{ name: "A1.1", description: "", value: "10" }, { name: "A1.2", description: "", value: "5" }] }, { name: "A2", description: "", value: "100" }, { name: "A3", description: "", value: "20" }, { name: "A4", description: "", value: "50" }] }, { name: "B", description: "", value: "10" }] };

console.log(mapItems([{ name: data.name, comprisedOf: data.characteristics }]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;