克隆JS TreeModel树
我需要克隆一个使用TreeModel.js制作的树。 我真正需要做的是复制它,对其进行更改并检查节点数是否减少。 如果是,请恢复原始树。 这是我到目前为止复制它的一个小例子,这是不正确的:
var tree = new TreeModel(); var root = tree.parse({ id: 0, name: "Root", children: [{id: 1, name: "1", children: []},{id: 2, name: "2", children: []}] }); console.log(root) var dup = tree.parse(root) console.log(dup)
这是一个小提琴 。 通过查看控制台,您将看到树之间的差异:
Node {config: Object, model: Object, children: Array[2], isRoot: function, hasChildren: function…} Node {config: Object, model: Node, children: Array[2], isRoot: function, hasChildren: function…}
有没有办法正确克隆这样的结构? 我寻找克隆JS对象,但仍然,我找不到一种方法来准确克隆这个对象(比如模型的属性原型……)
您可以深度克隆第一个树的模型并再次解析它以获得第二个树。
举个例子:
function deepCopy(obj) { // You can also use the jquery extend method here return JSON.parse(JSON.stringify(obj)); } var dup = tree.parse(deepCopy(root.model));
重要提示:如果您没有深度克隆模型,并且只是再次解析它,那么最终将使用两个树共享的相同底层模型,这肯定会导致不一致。
我终于找到了一个解决方案,可以帮助任何有同样问题的人:
var tree = new TreeModel(); var root = tree.parse({ id: 0, name: "Root", children: [{id: 1, name: "1", children: []},{id: 2, name: "2", children: []}] }); console.log(root) var dup = tree.parse(root.model) console.log(dup)
parse
函数将模型作为参数,root的模型似乎工作正常。
编辑:此解决方案可能会带来不一致,因为2棵树基于相同的模型。 JNS的解决方案更合适。
为什么不尝试jQuery深层复制?
var dup = jQuery.extend(true, {}, tree)
我试过你的小提琴,但似乎没有用。
https://github.com/mrluc/owl-deepcopy这对我有用。
newTree = deepCopy(tree)