首页 新闻 会员 周边 捐助

关于js中json遍历问题

0
[已解决问题] 解决于 2018-07-09 13:05

我想把一棵树的数据遍历放到另一棵树中,求解

刘凌枫羽的主页 刘凌枫羽 | 菜鸟二级 | 园豆:355
提问于:2018-07-05 17:41
< >
分享
最佳答案
0

如果你单纯是想做到深度复制,没必要遍历,给你一个更简单的方法"序列化与反序列化"

var data = {a:1, b : {b1:10, b2 : 20}, c : "3"};//需要复制的json对象

//序列化
var jsonStr = JSON.stringify(data);

//反序列化
var data2 = JSON.parse(jsonStr);
//IE一些比较旧的版本不支持这个方法可以用下面这个方法替代
var data3 = eval("(" + jsonStr + ")");

或者使用JQuery的方法$.extend方法 参考jQuery $.extend()用法总结

 

当然如果需要“遍历”的话,你涉及到一个树的遍历问题,关于树,根据需求不同,算法各种样。最简单粗暴的要数递归

 1 var Traversing = function(obj)
 2 {
 3     var tree = {};
 4     for(var key in obj)
 5     {
 6         if(IsObject(obj[key]))
 7         {
 8             tree[key] = Traversing(obj[key]);
 9         }
10         else
11         {
12             tree[key] = obj[key];
13         }
14     }
15     return tree;
16 }
17 
18 var IsObject = function(object){
19      return (typeof object == 'object') && object != null && object.constructor == Object;
20 }
奖励园豆:5
写代码的相声演员 | 小虾三级 |园豆:517 | 2018-07-05 19:40

我不是想复制,想把一棵树变成另一棵树的孩子,目前可以拿到两棵树结构。。。。

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-06 17:42

@刘凌枫羽: 

1 var tree1 = {a: 1, b : "2"};
2 var tree2 = {key1:"value1",key2:"value2"}
3 tree1["c"] = tree2;
4 console.log(tree1);

保证你的的浏览器版本比较新,比较老的浏览器,第三行会报错,需要从新建立对象,遍历tree1,后再赋值

 

上面代码运行结果

 

PS:

这种强制赋值的方法是浅度复制,在你通过 tree1.c.key1 = 'test' 这种方法赋值的时候,tree2.key1的值也会发生改变

写代码的相声演员 | 园豆:517 (小虾三级) | 2018-07-09 12:48

@写代码的相声演员: 我这个问题比较复杂,这样的回答也没问题,可能是我描述有问题。公司现在做的一个项目,要我实现页面左面的树拖动节点到右面的树上,并且让拖动的子节点一并倒过去,而且两棵树的结构有点不同,还得统一结构,真的是很烦,ztree现成又不能用。。。。

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-09 13:10

@写代码的相声演员: 我想问一下tree结构中没有children怎么添加啊

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-11 09:15

@刘凌枫羽: 就是像我上面给你那个tree1,tree2的方法一样啊。

就像给tree1添加C节点一样啊。直接加就行啊。

你的tree在js中无论长成什么样子,他都是一个object,js中可以通过中括号的形式来调用,同样也可以增加属性。

你要给tree添加children属性,直接 tree["children"] = tree2; 就行。

小伙子,对树结构的理解还不够透彻啊,不是节点有children,child,leftchild,等属性才可以称之为树节点结构,多个array嵌套一样可以算是树结构,在js这种弱变量类型语言,更是这样。

写代码的相声演员 | 园豆:517 (小虾三级) | 2018-07-11 09:29

@写代码的相声演员: 我用push的话就没问题,但是data.children是undefined不能push,用你说的这种方法就抱一个错data.children.forEach is not a function

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-11 10:08

@写代码的相声演员: 树对象是拼好了

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-11 10:08

@写代码的相声演员: 这是我拼好的

刘凌枫羽 | 园豆:355 (菜鸟二级) | 2018-07-11 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册