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