一个JS递归问题

77413036 2014-08-22 04:08:57
不知道是代码问题还是理解问题。
使用JS递归查指定ID下的text。数据源为JSON

数据源:
  var data = [
{
"sort": 0,
"id": 2,
"children": [
{
"sort": 0,
"id": 5,
"children": [
{
"sort": 99,
"id": 17,
"children": [],
"pid": 5,
"text": "a"
},
{
"sort": 98,
"id": 18,
"children": [],
"pid": 5,
"text": "b"
},
{
"sort": 97,
"id": 19,
"children": [],
"pid": 5,
"text": "c"
}
],
"pid": 2,
"text": "d"
},
{
"sort": 0,
"id": 6,
"children": [
{
"sort": 0,
"id": 36,
"children": [],
"pid": 6,
"text": "e"
}
],
"pid": 2,
"text": "f"
},
{
"sort": 0,
"id": 7,
"children": [
{
"sort": 99,
"id": 37,
"children": [],
"pid": 7,
"text": "g"
}
],
"pid": 2,
"text": "h"
}
],
"pid": 0,
"text": "i"
}
];


调用方法:
 
function formatCate() {
var a= traverse(data, 19);
console.log(a); //控制台输出null
return a;
};


递归方法:
function traverse(jsonObj, val) {
for (var i in jsonObj) {
if (typeof jsonObj[i] == "object") {
if (jsonObj[i].hasOwnProperty("id")) {
if (jsonObj[i].id == val) {
console.log(jsonObj[i].text); //控制台 输出 c
return jsonObj[i].text;
}
}
traverse(jsonObj[i], val); //1. 此处如果用 return traverse(jsonObj[i], val); 无法获取到 id为19的text,正常递归也应该用return
}
}
return null;
}


调用方法后,traverse方法的调试输出 输出了正确的值。但是到了formatCate的时候,值变成了null
搞了半天,还是求助一下集体的力量。
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
77413036 2014-08-22
  • 打赏
  • 举报
回复
引用 10 楼 u012463264 的回复:
alert(digui(data,37)); function digui(data,id){ var s=""; for(var i in data){ if(data[i]["id"]==id){ s= data[i]["text"]; break; } if(s==null||s==''){ if(data[i]["children"].length>0){ s= digui(data[i]["children"],id); } } } return s; }
之前也这么测试过,结果少了个break。答案就变了。非常感谢。 我还有个帖子没人回答。问题自己解决了。没法结贴。 麻烦你去这个帖子回复下拿分。 再次感谢你的热心。
77413036 2014-08-22
  • 打赏
  • 举报
回复
引用 8 楼 xzy21com 的回复:
    function get_text(obj,id){
        if(obj){
            for(var i = obj.length;i--;){
                if(obj[i].id == id){
                    console.log(obj);
                    return obj[i].text || "";
                }
                var a = get_text(obj[i].children,id);
                if(a){return a}
            }
        }
    }
    console.log(get_text(data,37));
正解。受教了。非常感谢
别闹腰不好 2014-08-22
  • 打赏
  • 举报
回复
alert(digui(data,37)); function digui(data,id){ var s=""; for(var i in data){ if(data[i]["id"]==id){ s= data[i]["text"]; break; } if(s==null||s==''){ if(data[i]["children"].length>0){ s= digui(data[i]["children"],id); } } } return s; }
xuzuning 2014-08-22
  • 打赏
  • 举报
回复
function traverse(jsonObj, val) {
  for (var i in jsonObj) {
    if(typeof jsonObj[i] == "object") {
      if(jsonObj[i].id == val) {
        alert(jsonObj[i].text); //控制台 输出 c
        return jsonObj[i].text;
      }
      var t = traverse(jsonObj[i].children, val);
      if(t != null) return t;
    }
  }
  return null;
}
scscms太阳光 2014-08-22
  • 打赏
  • 举报
回复
    function get_text(obj,id){
        if(obj){
            for(var i = obj.length;i--;){
                if(obj[i].id == id){
                    console.log(obj);
                    return obj[i].text || "";
                }
                var a = get_text(obj[i].children,id);
                if(a){return a}
            }
        }
    }
    console.log(get_text(data,37));
别闹腰不好 2014-08-22
  • 打赏
  • 举报
回复
引用 6 楼 show_594 的回复:
[quote=引用 4 楼 u012463264 的回复:] alert(digui(data,7)); function digui(data,id){ var s=""; for(var i in data){ if(data[i]["id"]==id){ s= data[i]["text"]; break; } if(data[i]["children"].length>0){ s=digui(data[i]["children"],id); } } return s; }
首先非常感谢你的热心回复。 你使用的是第2级的children Id 如果换成第3级。又获取不到了。 我帖子的那个代码也有这个问题。如果不是19 而是2级分类的ID,也正常返回。 但是使用3级ID就返回NULL。 [/quote]原因是递归的时候找到值后,递归没有结束 。
77413036 2014-08-22
  • 打赏
  • 举报
回复
引用 4 楼 u012463264 的回复:
alert(digui(data,7)); function digui(data,id){ var s=""; for(var i in data){ if(data[i]["id"]==id){ s= data[i]["text"]; break; } if(data[i]["children"].length>0){ s=digui(data[i]["children"],id); } } return s; }
首先非常感谢你的热心回复。 你使用的是第2级的children Id 如果换成第3级。又获取不到了。 我帖子的那个代码也有这个问题。如果不是19 而是2级分类的ID,也正常返回。 但是使用3级ID就返回NULL。
77413036 2014-08-22
  • 打赏
  • 举报
回复
引用 2 楼 Tony__1983 的回复:
traverse(jsonObj[i], val)
改成
arguments.callee(jsonObj[i], val)
试试看
感谢回复。 试了下,即使使用arguments.callee调用自身。控制台依旧输出 c null 而不是想要的 c c
别闹腰不好 2014-08-22
  • 打赏
  • 举报
回复
alert(digui(data,7)); function digui(data,id){ var s=""; for(var i in data){ if(data[i]["id"]==id){ s= data[i]["text"]; break; } if(data[i]["children"].length>0){ s=digui(data[i]["children"],id); } } return s; }
77413036 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 u012463264 的回复:
digui(data,7); function digui(data,id){ for(var i in data){ if(data[i]["id"]==id) alert(data[i]["text"]); if(data[i]["children"].length>0){ digui(data[i]["children"],id); } } }
运行没问题。但是改成接受digui的值。 问题就出现了,跟我上面的代码一样。 修改后:

alert(digui(data,7));
		function digui(data,id){
				for(var i in data){
							if(data[i]["id"]==id)
								return data[i]["text"];
						if(data[i]["children"].length>0){
							digui(data[i]["children"],id);
						}
					
					}
		
		}
Tony__1983 2014-08-22
  • 打赏
  • 举报
回复
traverse(jsonObj[i], val)
改成
arguments.callee(jsonObj[i], val)
试试看
别闹腰不好 2014-08-22
  • 打赏
  • 举报
回复
digui(data,7); function digui(data,id){ for(var i in data){ if(data[i]["id"]==id) alert(data[i]["text"]); if(data[i]["children"].length>0){ digui(data[i]["children"],id); } } }

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧