克隆JS TreeModel树

7

我需要克隆使用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对象,但仍然找不到确切克隆此对象的方法(例如像模型等属性的原型)。

4个回答

3
你可以深度克隆第一棵树的模型,然后再次解析以获取第二棵树。
以你的示例为例:
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));

重要提示:如果您不进行深度克隆模型,而只是再次解析它,那么您将得到由两个树共享的相同底层模型,这肯定会导致不一致。


1
你是写这个库的人对吧?那么,直接执行 tree.parse(root.model); 有什么区别吗? - Johy
太棒了。非常感谢您提供的库和答案。;-) - Johy

1

我最终找到了一个解决方案,可以帮助任何遇到相同问题的人:

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函数以模型为参数,并且根模型似乎工作正常。

编辑:由于这两个树基于相同的模型,因此此解决方案可能会带来不一致性。JNS的解决方案更合适。


0

为什么不尝试一下 jQuery 深拷贝?

var dup = jQuery.extend(true, {}, tree)

我试了一下你的fiddle但好像不起作用。


你有检查控制台吗?那里我可以检查结构。 是的,我尝试了深层复制,但仍然无法获得精确的副本。在这个更新的Fiddle中查看控制台:http://jsfiddle.net/pvzb9vd2/5/ - Johy
是的,我太晚才意识到你并没有在“log” div中编写,而是在控制台上编写。我同意,那确实不是同一个对象。 - A. Rama
1
我认为我找到了这个解决方案:var dup2 = tree.parse(root.model)*编辑:好的,你也找到了 :) - A. Rama

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接