2017-02-10 88 views
0

我想通過使用immutable.js將JSON對象的片段更新/替換爲其他部分。immutable.js - 替換複雜和嵌套對象中的節點

看看下面的例子。我們可以看到一些更復雜和嵌套的對象。用"id": "F"代替節點,我想用其他編輯節點替換/更新。

根據docs我需要以某種方式得到keyPath作爲數組,並將其傳遞給setIn(keyPath: Array<any>, value: any): Map<K, V>函數。所以我需要以某種方式找到F keypath:['children',2,'children',0,'children',0](這是否正確?)。

這是簡化的例子。在我的情況下,我的keypath有更復雜的層次結構。如何通過immutable.js或普通的JS來做到這一點?這種方法是否正確?是否存在相同行爲的更優雅的解決方案(如果可能,完美地使用immutable.js函數)?

最好的問候,

拉法爾

例子:

{ 
    "id": "A", 
    "children": [ 
     { 
      "id": "B", 
      "children": [ 

      ] 
     }, 
     { 
      "id": "C", 
      "children": [ 

      ] 
     }, 
     { 
      "id": "D", 
      "children": [ 
       { 
        "id": "E", 
        "children": [ 
         { 
          "id": "F", // THIS NODE WILL BE UPDATED 
          "children": [ 

          ] 
         } 
        ] 
       }, 
       { 
        "id": "G", 
        "children": [ 

        ] 
       } 
      ] 
     } 
    ] 
} 

回答

0

如果你有有效地確定你要更新的節點的keyPath一種手段,那麼.setIn()是一個簡單的解決方案將完成工作。

但是,有其他方法可以解決這個問題,但它們確實取決於您試圖解決的確切問題。

鑑於你的例子,如果id屬性是真正獨一無二的,你知道你在找什麼(如"id": "F"某處樹),那麼你可以用.updateIn()去創建一個搜索指定節點的謂詞的功能和更新它。根據您的規格實施DFS或BFS。如果你正在處理List結構,那麼.find().findIndex()也可能是非常有價值的工具。

還有一件事你可能要考慮 - 扁平你的數據。這不是最喜歡的,但它可以完成工作,並且可以更容易地處理大量的UI內容。

在圖例中,將其展平爲Maps的List,並讓每個項目保留其子項和/或父母的uuids的參考。這樣你可以遍歷List並根據一個簡單的謂詞找到需要更新的元素。

+0

謝謝。你的答案後,我決定寫我自己的遞歸函數,它返回一個數組keyPath。現在我可以很容易地使用像setIn,updateIn等immutable.js函數。不過,我仍然想知道如何使用immutable.js函數(如.find(),findIndex()或育肥數據)來實現相同的結果。我不知道這些方法有什麼最好的表現。 –