递归AngularJS过滤器

时间:2014-06-13 13:02:11

标签: angularjs recursion tree angularjs-filter

我有一个存储在$scope.tree对象中的树结构like this。我想创建一个过滤器,我可以将其应用于此树,将其缩小为this,以便能够像$scope.cut_tree = $filter('cutTree')($scope.tree)那样进行smth,并获得缩小的输出。

但是我真的不知道该怎么做,到目前为止我尝试过的所有东西都没有让我到处都是,因为我最终改变了$ scope.tree本身。

更新

到目前为止我所拥有的:

app.filter("filterTree", ["$filter", function($filter) {
    return function(tree) {
      var newTree = [];
      angular.forEach(tree, function(node, index) {
        var newNode;
        newNode = {
          id: node.id,
          sort_order: index,
          children: $filter('filterTree')(node.children)
        };
        newTree.push(newNode);
      });
      return newTree;
    };
  }
]);

2 个答案:

答案 0 :(得分:1)

创建一个只复制你想要的字段的递归函数应该相对容易。例如

var cutTree = function(original){
    var result = {};
    result.id = original.id;
    result.name = original.name;
    result.children = [];

    for (var i=0; i<original.children.length; i++)
    {
        result.children.push(cutTree(original.children[i]));
    }

    return result;
}

然后你只需要定义一个过滤器来调用这个函数并返回它的结果。

答案 1 :(得分:1)

我在这个JsFiddle中做了一个有效的例子。

使用的过滤器如下:

angular.module('myApp').filter('cutTree', ['$filter',function ($filter) {
    return function (tree) {
        var res = [];
        var sortOrder=0;
        angular.forEach(tree, function(item) {
            // Deep copy

           var copy = angular.fromJson(angular.toJson(item))
           res.push({
               id:copy.id,
               sort_order:sortOrder,
               children:$filter('cutTree')(item.children)
           })
           sortOrder++;
     });
        return res;
    };
}]);