immutable.js - 替换复杂和嵌套对象中的节点

时间:2017-02-10 13:23:57

标签: javascript json immutable.js

我想使用immutable.js更新/替换我的JSON对象的片段与其他部分。

请看下面的例子。我们可以看到一些更复杂和嵌套的对象。用"id": "F"代替节点我想用其他一些编辑过的节点替换/更新。

根据docs,我需要以某种方式将keyPath作为数组并将其传递给setIn(keyPath: Array<any>, value: any): Map<K, V>函数。

所以我需要以某种方式找到F keypath:[&#39; children&#39;,2,&#39; children&#39;,0,&#39; children&#39;,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": [

                    ]
                }
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

如果您有办法有效地确定要更新的节点的keyPath,那么.setIn()是一个简单的解决方案,可以完成工作。

然而,还有其他方法可以解决这个问题,但它们确实依赖于您要解决的确切问题。

根据您的示例,如果id属性是真正唯一的并且您知道要查找的内容(例如树中某处的"id": "F"),那么您可以使用.updateIn()和创建一个谓词函数,用于搜索指定节点并对其进行更新。根据您的规范实施DFS或BFS。如果您正在处理列表结构,那么.find().findIndex()也可能是非常有价值的合成工具。

您可能还需要考虑另一件事 - 展平您的数据。它不是一个受欢迎的,但它可以完成工作,也可以更容易使用很多UI的东西。

在图表的示例中,将其展平为List地图,并让每个项目都保留其子女和/或父母的uuids的参考。这样,您就可以遍历List并找到需要根据简单谓词更新的元素。