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

Javascript immutable.js-替换复杂嵌套对象中的节点,javascript,json,immutable.js,Javascript,Json,Immutable.js,我想使用immutable.js用其他部分更新/替换JSON对象的片段 看看下面的例子。我们可以看到一些更复杂的嵌套对象。用“id”替换节点:“F”我想用其他编辑的节点替换/更新 根据需要,我需要以某种方式获取keyPathas数组,并将其传递给setIn(keyPath:array,value:any):Map函数 所以我需要找到F键路径:[children',2',children',0',children',0](对吗?) 这是一个简化的例子。在我的例子中,我的密钥路径具有更复杂的层次结构

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

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

根据需要,我需要以某种方式获取
keyPath
as数组,并将其传递给
setIn(keyPath:array,value:any):Map
函数

所以我需要找到F键路径:[children',2',children',0',children',0](对吗?)

这是一个简化的例子。在我的例子中,我的密钥路径具有更复杂的层次结构。如何通过immutable.js或plain 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": [

                    ]
                }
            ]
        }
    ]
}

如果您有一种方法可以有效地确定要更新的节点的
关键路径
,那么
.setIn()
是一个简单的解决方案,可以完成任务

然而,还有其他方法可以解决这个问题,但它们确实取决于您试图解决的确切问题

举个例子,如果
id
属性确实是唯一的,并且您知道要查找什么(例如
“id”:“F”
,那么您可以使用
.updateIn()
创建一个谓词函数来搜索指定节点并更新它。根据您的规格实施DFS或BFS。如果您处理的是列表结构,那么
.find()
.findIndex()
也可能是非常有价值的组合工具

还有另外一件事你可能需要考虑——扁平化你的数据。它不是最受欢迎的,但它可以完成工作,而且对于许多UI内容来说,它也更容易使用


在图形的示例中,将其展平到地图的
列表
,并让每个项目保留其子级和/或父级的UUID的引用。这样,您就可以遍历列表,根据简单的谓词找到需要更新的元素。

谢谢。在您回答之后,我决定编写自己的递归函数,该函数返回一个数组作为keyPath。现在我可以很容易地使用immutable.js函数,如setIn、updateIn等。然而,我仍然想知道如何使用immutable.js函数,如.find()、findIndex()或fatting data来获得相同的结果。我想知道这些方法中哪一种性能最好。