我正在迁移一些代码以使用不可变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"]
实例。
现在你可能会认为我已经领先于自己了,但是没有不可变的代码版本已经遇到了使用太多内存的问题,所以不要想要不可变的添加(&和希望使用不可变的将避免一些)
答案 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对象与合并一个常规对象区别开来。