【问题标题】:Immutable JS Record Structural Sharing不可变 JS 记录结构共享
【发布时间】:2017-10-03 11:22:41
【问题描述】:

我正在迁移一些代码以使用不可变 JS,特别是记录类型,并且我正在实现一些代码,将已从 API 读取的常规 JS 对象转换为记录类型,我很想确保我写这篇文章的方式是为了尽可能多地进行结构共享。

想象一下 NodeRecord 有 3 个字段 id, type and parent (还有其他字段,但对于 例子)

id 始终是唯一的

type 是一组

所以我只有 10 个“种子”,即

const LineSeed = new NodeRecord({type: 'line'})

所有不同类型的记录,然后当从 JS 对象转换为不可变时,我可以做类似的事情

if (node.type === 'line') {
    return LineSeed({id: nodeId})`
}

这意味着结构的 {type: 'line'} 部分被重用了……哎呀!

接下来我想知道的是,我可以用parent字段做同样的事情吗,parent/type的不同组合太多,无法拥有全套种子对象,

所以我想知道是否有一些 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 会避免其中一些)

【问题讨论】:

  • 要让node1node2 共享parent,您必须对merge 进行两次调用,并将相同的不可变映射作为参数。
  • @4castle Nah 这也不起作用我已经通过不可变代码进行了调试,现在意识到它没有以可行的方式实现......我会回答我自己的问题跨度>

标签: javascript immutable.js


【解决方案1】:

我查看了 Immutable JS 代码,发现这是不可能的。

它的核心是每个键/值都在内部存储为一个 2 元素数组

['parent', '111']

现在在.merge 代码中,它最终有效地调用了

Map.set('parent', '111') 用于合并中的任何项目 ... 这一定意味着 2 元素数组正在以下某处创建。

这一切都是有道理的,代码并没有真正将合并不可变对象与合并常规对象区别对待。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2013-01-11
    相关资源
    最近更新 更多