Javascript 不可变JS记录结构共享
我正在迁移一些代码以使用不可变JS,特别是一种记录类型,并且我正在实现一些代码,将从API读取的常规JS对象转换为记录类型,我非常希望确保我以一种允许尽可能多的结构共享的方式编写此代码 想象一下,Javascript 不可变JS记录结构共享,javascript,immutable.js,Javascript,Immutable.js,我正在迁移一些代码以使用不可变JS,特别是一种记录类型,并且我正在实现一些代码,将从API读取的常规JS对象转换为记录类型,我非常希望确保我以一种允许尽可能多的结构共享的方式编写此代码 想象一下,NodeRecord有3个字段id、type和parent(还有其他字段,但这就足够了) (示例) id始终是唯一的 type是一组
NodeRecord
有3个字段id、type和parent
(还有其他字段,但这就足够了)
(示例)
id
始终是唯一的
type
是一组<10个选项(直线、矩形、椭圆形…)
所以我只有10个“种子”,即
constlineseed=newnoderecord({type:'line'})
所有不同类型的记录,然后当从JS对象转换为Immutable时,我可以执行以下操作
if (node.type === 'line') {
return LineSeed({id: nodeId})`
}
这意味着结构的{type:'line'}部分被重用。。。哇
接下来我想知道的是,我可以对父项
字段执行相同的操作吗?父项/类型
的不同组合太多,无法拥有完整的种子对象集
因此,我想知道是否有某种merge()
的味道可以让这一切顺利进行
我试过标准合并,但没有
node1.merge({parent: '111'}) // What could go here which would mean the
node2.merge({parent: '111'}) // parent gets shared between node1 and node2
正如预期的那样,我可以通过调试器看到在这两个节点下存储了两个不同的[“parent”,“111”]
实例
现在你可能会认为我超越了自己,但是没有immutable的代码版本已经遇到了使用太多内存的问题,所以不希望immutable添加到这一点上(希望使用immutable可以避免一些问题)我研究了immutable JS代码,发现这是不可能的 它的核心是每个键/值在内部存储为一个2元素数组 i、 e.
['parent','111']
现在,在.merge
代码中,它将有效地调用
Map.set('parent','111')
用于合并到中的任何项目。。。这意味着2个元素的数组将在该数组下面的某个位置创建
所有这些都是有意义的,代码对合并不可变对象的处理与合并常规对象的处理没有任何区别。对于
node1
和node2
,要共享父对象
,您必须同时调用merge
同一个不可变映射作为参数。@4castle-Nah这不起作用,或者我已经调试了不可变代码,现在意识到它没有以一种可以起作用的方式实现。。。我会回答我自己的问题