如何处理可变性与性能之间树结构的权衡

时间:2016-05-18 21:58:45

标签: javascript tree immutability

似乎我在实现树结构库时遇到了一个问题,但这是一个至关重要的问题。

假设我有两个核心构造函数:TreeNode 而Tree对象将具有管理树的方法,并获得对Node对象的引用。

我似乎无法解决的问题是,Node对象(及其子对象)似乎必须是不可变的。我们不想要的是库的用户可以改变内部结构:

var childNodes = Tree.findNode(5).children; 
var node = children[0]; 
node = "overwrite with something"; 

var parentNode = Tree.findNode(5).parent; 
parentNode.children = { text: "Doesn't realize this will change the original node's children" }; 

它会影响当前的树并搞砸内部工作。

或者,如果我假设使用不可变对象/数组,则意味着连续副本 假设我想将树结构上的10个随机节点移动到单个节点(下)。这意味着制作副本并重新分配整个数组以便改变它们。 (我们不知道阵列会有多长!)。对于没有可变数据结构成本的东西来说,这似乎是一种极大的过度杀伤力。在我的脊椎中感觉它也将是更加繁琐的代码。

我尝试了很多变通办法,但最终却陷入了同样的困境 我该如何解决这个问题?

编辑:几乎忘了提到我使用数组作为节点子节点,因为顺序对我的用例很重要。

1 个答案:

答案 0 :(得分:0)

我决定使用不可变节点对象;这样就不允许lib用户意外搞砸了内部工作。

我担心的是因为制作太多副本会受到影响。据我所知,有一种处理不可变对象的高效方法,这是Immutablejs开箱即用的方式。
在观看了一些演示文稿并阅读了文档之后,我对它们提供所需灵活性的广泛API感到惊喜。

策略是在返回Immutable对象或本机Javascript对象之间提供用户选择(当使用React时,Immutable似乎是一个非常受欢迎的选择)。但在内部,库将使用Immutable对象。

@SebstienDaniel感谢您提出的建议,这是当场的。