首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在javascript中制作递归嵌套数组?

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

Stack Overflow用户
提问于 2018-06-03 21:54:07
回答 2查看 60关注 0票数 -2

下面是我拥有的json:

代码语言:javascript
复制
{
    "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"
        }
    ]
}

这里我有两个特征对象"test“-A和B.These 2对象可能有也可能没有"comprisedOf”数组。例如A有“comprisedOf”数组,而B没有。这些comprisedOf数组还可以或可以不包括对象数组。

现在我要做一个数组,就像下面给出的数组一样:

代码语言:javascript
复制
[
    {
        "name": "test",
        "children": [
            {
                "name": "A",
                "children": [
                    {
                        "name":"A1",
                        "children:: [
                            {
                                "name":  "A1.1"
                            },
                            {
                                "name": "A1.2"
                            }
                        ]
                    },
                    {
                        "name": "A2"
                    },
                    {
                        "name": "A3"
                    },
                    {
                        "name": "A4"
                    }
                ]
            },
            {
                "name": "B"
            }
        ]
    }
]

如何在第一个数组的基础上递归形成这个数组?

非常感谢!

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

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 02:05:22

为了实现递归,您希望函数返回并能够将该返回赋值给当前对象

就像这样

代码语言:javascript
复制
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))
代码语言:javascript
复制
.as-console-wrapper {	max-height: 100%!important;}
代码语言:javascript
复制
<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>

票数 2
EN

Stack Overflow用户

发布于 2018-06-04 02:56:20

您可以采用不同的起始数组,并对所需的属性使用解构。

代码语言:javascript
复制
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 }]));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES5

代码语言:javascript
复制
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 }]));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50667125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档