这个函数可以递归或更干净地重写吗?

时间:2015-10-07 13:53:19

标签: javascript jquery angularjs

此函数match将属性(折叠)设置为true或false,具体取决于 字符串的值:

function match(children) {

    var data = $scope.treeData
    for (var i = 0; i < data.length; i++) {
        var s = data[i]
        for (var i2 = 0; i2 < s.children.length; i2++) {
            var s2 = s.children[i2]
            for (var i3 = 0; i3 < s2.children.length; i3++) {
                for (var i4 = 0; i4 < s2.children[i3].children.length; i4++) {
                    var text = "";
                    if ($scope.searchText == undefined) {
                        text = ""
                    } else {
                        text = $scope.searchText
                    }
                    if (s2.children[i3].children[i4].label
                        .toLowerCase() === text.toLowerCase()) {
                        s2.children[i3].collapsed = false
                    }
                }
            }

        }
    }
}

排除变量名i3,i2等的不良使用是否有更清洁的方法?     由于最内层循环需要访问外部循环,还可以使用递归吗?

更新:

数据结构:

[{"label":"test","collapsed":false,"children":[{"label":"test","collapsed":false,"children":[],"$$hashKey":"002"}],"$$hashKey":"001"}]

更新2:

使用递归函数,但字符串&#39; test&#39;没有匹配:

http://jsfiddle.net/U3pVM/19196/

小提琴src:

<div ng-app>
  <h2>Todo</h2>
  <div ng-controller="TodoCtrl">

  </div>
</div>

function TodoCtrl($scope) {

    var json = [{"label":"test","collapsed":false,"children":[{"label":"test","collapsed":false,"children":[],"$$hashKey":"002"}],"$$hashKey":"001"}]

     var searchText = 'test'

     function match(node, searchText){
            angular.forEach(node.children, function(idx, child){
                node.collapsed = child.label.toLowerCase === searchText.toLowerCase
                console.log(node.collapsed)
                if(child.children.length > 0){
                    match(child, searchText);
                }
            });
        }

    match(json, searchText);


}

3 个答案:

答案 0 :(得分:1)

请试试这个:

function match2(obj){

if (obj.children) {
    for (var i = 0; i < obj.children.length; i++) {
        match2(obj.children[i]);
    }
}
else {
    var text = $scope.searchText ? $scope.searchText : "";

    if (obj.label
            .toLowerCase() === text.toLowerCase()) {
        obj.collapsed = false
    }
}

答案 1 :(得分:0)

我觉得这样的事可能适合你。我对角度一无所知,可能会有一些东西可以让它变得更容易。

var searchText = ($scope.searchText == undefined) ? "": $scope.searchText;
match($scope.treeData, searchText);

function match(node, searchText){
    $.each(node.children, function(idx, child){
        node.collapsed = child.label.toLowerCase === searchText.toLowerCase
        if(child.children.length > 0){
            match(child, searchText);
        }
    });
}

答案 2 :(得分:0)

你的JSFiddle几乎就在那里。我对此working JSFiddle进行了一些更改。

首先,您将数组传递给match而不是对象。我将json变量更改为json而不是删除外部[],但您也可以通过传递json[0]来修复此问题。

另一个变化是您有两个参数childidx,这是错误的方法。

function match(node, searchText){
    angular.forEach(node.children, function(child, idx){
        node.collapsed = child.label.toLowerCase === searchText.toLowerCase
        console.log(node.collapsed)
        if(child.children.length > 0){
            match(child, searchText);
        }
    });
}

another的方式使用some

function match (node, searchText) {
    node.collapsed = node.children.some(function(child) {
        return child.label.toLowerCase === searchText.toLowerCase;
    });
    angular.forEach(node.children, function(child, idx){
        match(child, searchText);
    })
}