不可变的JS记录结构共享

时间:2017-05-05 05:26:21

标签: javascript immutable.js

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

想象一下,NodeRecord有3个字段id, type and parent(还有其他字段,但这足够了 例子)

id始终是唯一的

type是一组< 10个选项(线条,矩形,椭圆......)

所以我只有10"种子"即

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

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

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"]实例。

现在你可能会认为我已经领先于自己了,但是没有不可变的代码版本已经遇到了使用太多内存的问题,所以不要想要不可变的添加(&和希望使用不可变的将避免一些)

1 个答案:

答案 0 :(得分:0)

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

它的内容是每个键/值在内部存储为2元素数组

即。 .merge

现在在Map.set('parent', '111')代码中,它最终会有效地调用

class openBrowser() { public static WebDriver driver; public static AppiumDriver<MobileElement> androidDriver; @Test public static void launchBrowser(){ desiredCapabalities(...); androidDriver = new AndroidDriver<MobileElement>(new URL("http://localhost:4723/wd/hub", desiredCapabilities)); driver = androidDriver; } class pickDate() { MobileElement element; try{ element = (MobileElement) androidDriver.findElementByXPath("//android.view.View[@content-desc='28 May 2017']").click(); }catch(Exception e) { throw e; } } 对于要合并的任何项目...这必须意味着在其下方的某处创建了2个元素数组。

所有这些都是有道理的,代码并没有真正将合并一个Immutable对象与合并一个常规对象区别开来。