6

我需要克隆使用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

4 回答 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));

重要提示:如果你不深度克隆模型,只是再次解析它,你最终会得到两棵树共享的相同底层模型,这肯定会导致不一致。

于 2014-12-15T11:09:08.170 回答
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函数将模型作为参数,并且根模型似乎工作正常。

编辑:此解决方案可能会带来不一致,因为 2 棵树基于相同的模型。JNS 的方案比较合适。

于 2014-12-15T10:52:26.740 回答
0

为什么不尝试 jQuery 深拷贝?

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

我试过你的小提琴,但它似乎不起作用。

于 2014-12-15T10:30:29.490 回答
0

https://github.com/mrluc/owl-deepcopy 这对我有用。

newTree = deepCopy(tree)

于 2016-06-24T07:36:16.237 回答