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



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

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

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

所以我需要找到F密钥路径:['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": [
]
}
]
}
]
}

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

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

举个例子,如果id属性真的是唯一的,并且你知道你在寻找什么(例如树中的某个地方的"id": "F"),那么你可以使用.updateIn()创建一个谓词函数来搜索指定的节点并更新它。根据你的规范实现DFS或BFS。如果您正在处理List结构,那么.find().findIndex()也可能是组合中非常有价值的工具。

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

在图形的示例中,将其展平为贴图的List,并使每个项都保留其子项和/或父项的uuid的引用。通过这种方式,您可以遍历List并找到需要基于简单谓词更新的元素。

最新更新