2017-05-05 56 views
0

我正在遷移一些代碼來使用Immutable JS,特別是一個記錄類型,並且我正在實現一些將已經從API中讀取的常規JS對象轉換爲Record類型的代碼,而我我熱衷於確保自己的寫作方式能夠儘可能多地進行結構共享。Immutable JS記錄結構共享

想象NodeRecord有3場id, type and parent(還有其他的,但多數民衆贊成足夠 的例子)

id始終是唯一的

type是一套< 10個選項(線條,矩形,橢圓形。 ..)

所以,我只是有10個 「種子」,即

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

記錄各種不同類型的,然後從JS對象轉換爲不可變的情況下,我可以這樣做

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

這意味着{類型:「線」}的結構的一部分被再利用......吶喊!

我接下來想知道什麼,我可以做同樣的事情與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

對於'node1'和'node2'要共享'parent',你必須將兩個調用都作爲參數提供給'merge'同一個不可變映射。 – 4castle

+0

@ 4castle那不行,或者我已經通過不可變的代碼進行了調試,現在意識到它沒有以一種可行的方式實現......我會回答我自己的問題 – sMoZely

回答

0

我已經看着不可變的JS代碼,看到這是不可能的。

它的膽是每個鍵/值被作爲2元件陣列

['parent', '111']

現在在.merge代碼它結束了有效地調用

Map.set('parent', '111')任何項目被存儲在內部合併在...這意味着2元素數組正在創建的某個地方下面。

而且各種各樣的有道理,代碼並沒有真正看待合併Immutable對象的任何不同於合併常規合併對象。