Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个函数可以递归地重写还是更干净地重写?_Javascript_Jquery_Angularjs - Fatal编程技术网

Javascript 这个函数可以递归地重写还是更干净地重写?

Javascript 这个函数可以递归地重写还是更干净地重写?,javascript,jquery,angularjs,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

此函数
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
                    }
                }
            }

        }
    }
}
更新2:

使用递归函数,但字符串“test”不匹配:

小提琴手:

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


}

待办事项
函数TodoCtrl($scope){
var json=[{“label”:“test”,“collapsed”:false,“children”:[{“label”:“test”,“collapsed”:false,“children”:[],“$$hashKey”:“002”}],“$$hashKey”:“001”}]
var searchText='test'
函数匹配(节点,搜索文本){
angular.forEach(node.children,function)(idx,child){
node.collapsed=child.label.toLowerCase===searchText.toLowerCase
console.log(node.collapsed)
如果(child.childrence.length>0){
匹配(子项、搜索文本);
}
});
}
匹配(json、searchText);
}

我想这样的东西可能适合你。我不知道有什么东西可以让事情变得容易些

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(obj){

if(对象子对象){
for(变量i=0;i
您的JSFIDLE就快到了。我为此做了一些更改

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

另一个变化是,您有两个参数,
child
idx
,这两个参数是错误的

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);
        }
    });
}
以下是操作方法,使用:


一个额外的
}
,我相信复制粘贴错误上层是否包含属性
折叠的
标签
?还添加HTML标记$scope.treeData看起来像什么,我们可以举个例子吗?另外,由于您使用Angular,我认为如果使用Angular,此代码看起来会更干净。谢谢,我稍微更新了一下,使用了一个有角度的foreach。可以看一下我的问题更新吗?forEach没有运行。我对angular一点也不了解它的工作原理是否与jQuery.each()相同?它的工作原理应该相同,我会做更多的挖掘,谢谢。
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
    }
}
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);
        }
    });
}
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);
    })
}