JavaScript中的不可变哈希和数组实现?
作者:互联网
在javascript中是否有简单的不可变哈希和数组实现?我不需要最好的速度,合理的速度比克隆更好.
此外,如果Java或其他语言中的简单实现可以很容易理解并移植到JavaScript,那么它也会很好.
更新:
目标不仅仅是冻结散列(或数组),而是为了有效实现更新操作 – 更新不可变散列应该返回一个新的不可变散列.它应该比通过“克隆原始并更新它”更有效.
原生JS类型具有更新的复杂性,如O(1),克隆的复杂性将是O(n),具有特殊的不可变数据结构(我要求的)它将为0(log(n))
UPDATE2:JavaScript已经有Array / Hash:
是的,但它们是可变的,我需要类似但不可变的东西,基本上它可以通过克隆hash2 = hash1.clone(); hash2 [key] = value但它的效率非常低,有些算法使得它非常有效,而不使用克隆.
hash1 = {}
hash2 = hash1.set('key', 'value2')
hash3 = hash1.set('key', 'value3)
console.log(hash1) // => {}
console.log(hash2) // => {key: 'value2'}
console.log(hash3) // => {key: 'value3'}
解:
它不是不可变哈希的实现,但更像是我当前问题的黑客,也许它也有助于某人.
更多关于为什么我需要不可变数据结构 – 我使用Node.js和内存数据库.一个请求可以读取数据库,其他更新它 – 更新可能需要花费很多时间(调用远程服务) – 所以我无法阻止所有读取进程并等待更新完成,更新可能会失败并且数据库应该回滚.所以我需要以某种方式将(ACID)读写操作隔离到内存数据库中.
这就是为什么我需要不可变数组和哈希 – 来实现MVCC的种类.但似乎有一种更简单的方法可以做到这一点.而不是直接更新数据库 – 更新操作只记录对数据库的更改(但不直接执行) – 以“将42添加到数组db.someArray”的形式.
最后 – 更新操作的产品将是这样的更改命令的数组,并且因为它可以非常快速地应用 – 我们可以阻止数据库应用它.
但是,看看javascript中是否存在不可变数据结构的实现仍然很有趣,所以我将保持这个问题的开放性.
解决方法:
我知道这个问题已经过时但我认为像我这样的人应该指向Facebook的Immutable.js,它以非常有效的方式提供了许多不同类型的不可变数据结构.
标签:javascript,arrays,data-structures,hash,immutability 来源: https://codeday.me/bug/20191006/1862640.html