javascript中是否有简单的不可变哈希和数组实现?我不需要最好的速度,比克隆更好的合理速度就可以了。
此外,如果有Java 或其他一些易于理解并移植到 JavaScript 的语言的简单实现,那也很好。
更新:
目标不仅仅是冻结散列(或数组),而是要有效地执行更新操作 - 不可变散列的更新应该返回一个新的不可变散列。它应该比“克隆原始并更新它”更有效。
原生 JS 类型的更新复杂度类似于 O(1),克隆复杂度将是 O(n),使用特殊的不可变数据结构(我要求的)它将是 0(log(n))
UPDATE2: JavaScript 已经有 Array / Hash :
是的,但它们是可变的,我需要类似但不可变的东西,基本上可以通过克隆非常简单地完成,hash2 = hash1.clone(); hash2[key] = value
但效率非常低,有些算法使其非常有效,无需使用clone
.
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 中是否有不可变数据结构的实现仍然会很有趣,所以我将把这个问题留着。