繁体   English   中英

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

[英]how to properly use recursive function call to return the property of a nested object?

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

$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”功能,我正在使用以下功能:

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 [];
    }

这是我的支持功能:

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)相同的名称。

当前渲染如下:

Area-1
   Area-1
   Area-2
Area-2
   Area-1
Area-3
   Area-1
   Area-2
   Area-3

这需要看起来像是:

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 +".")});

将代码更改为此:

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);

尝试避免递归发送索引等。 有时候您不禁要发送索引,但是在这种情况下,您可以发送主数组并以递归方式调用每个元素的子数组调用相同的运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM