首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地使用递归函数调用来返回嵌套对象的属性?

如何正确地使用递归函数调用来返回嵌套对象的属性?
EN

Stack Overflow用户
提问于 2016-03-17 16:04:00
回答 1查看 129关注 0票数 0

在我的角应用程序中,我使用AngularTree指令(http://wix.github.io/angular-tree-control)呈现以下数据结构的树视图:

代码语言:javascript
复制
$scope.subjectAreas = [
        {
            name:   "Area-1",
            link:   "dashboards.dashboard_1",
            entities: [
                {
                    name: "entity 1"
                },
                {
                    name: "entity 2"
                }
            ]
        },
        {
            name:   "Area-2",
            link:   "dashboards.dashboard_1",
            entities: [
                {
                    name: "entity 3"
                }
            ]
        },
        {
            name:   "Area-3",
            link:   "dashboards.dashboard_1",
            entities: [
                {
                    name: "entity 4"
                },
                {
                    name: "entity 5"
                },
                {
                    name: "entity 6"
                }
            ]
        }
    ];

这个treeView指令提供了"createSubTree“函数,我正在使用它,如下所示:

代码语言:javascript
复制
function createSubTree(level, width, prefix) {
        if (level > 0) {
            var res = [];
            for (var i=1; i <= width; i++)
                res.push({ "label" : getName(i), "id" : "id"+prefix + i, "i": i,
                    "children": createSubTree(level-1, setNumberOfChildren(getName(i),i), prefix + i +".")});
            return res;
        }
        else
            return [];
    }

以下是我的辅助功能:

代码语言:javascript
复制
function countNumberOfEntities(index){

        return $scope.subjectAreas[index].entities.length;
    }

    function getSubjectAreasLength(){
        return $scope.subjectAreas.length;
    }

    function setNumberOfChildren(subjectArea, index){
        var numberOfChildEntities = countNumberOfEntities(index-1);
        return numberOfChildEntities;
    }

    function getName(index){
        if($scope.subjectAreas[index-1]){
            var subjectAreaName = $scope.subjectAreas[index-1].name;
            var n = subjectAreaName;
            return subjectAreaName;
        }
    }

树视图呈现得很好,但所有子对象(属于给定SubjectArea的实体名称)最终都具有与其父级(SubjectArea)相同的名称。

当前呈现如下所示:

代码语言:javascript
复制
Area-1
   Area-1
   Area-2
Area-2
   Area-1
Area-3
   Area-1
   Area-2
   Area-3

这需要看上去是:

代码语言:javascript
复制
Area-1
   Entity-1
   Entity-2
Area-2
   Entity-3
Area-3
   Entity-4
   Entity-5
   Entity-6

如何修改这个"createSubTree“函数以返回每个实体的名称,当它在这里被递归调用时:"children": createSubTree(level-1, setNumberOfChildren(getName(i),i), prefix + i +".")});

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-17 18:57:08

将代码更改为:

代码语言:javascript
复制
function createSubTree(ary) {
    var res = [];
    if (ary) {
        res = ary.map(function(v, k) {
            var id = k + 1;
            return {
                i: id,
                id: 'id' + id,
                label: v.name,
                children: createSubTree(v.entities)
            }
        });

    }
    return res;
}



$scope.treedata = createSubTree($scope.subjectAreas);

尽量避免在递归方法中发送索引等。有时,您不得不发送索引,但在本例中,您可以发送主数组,并对每个元素的子数组递归地调用相同的运行。

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

https://stackoverflow.com/questions/36065847

复制
相关文章

相似问题

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