我想使用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": [
]
}
]
}
]
}
答案 0 :(得分:0)
如果您有办法有效地确定要更新的节点的keyPath
,那么.setIn()
是一个简单的解决方案,可以完成工作。
然而,还有其他方法可以解决这个问题,但它们确实依赖于您要解决的确切问题。
根据您的示例,如果id
属性是真正唯一的并且您知道要查找的内容(例如树中某处的"id": "F"
),那么您可以使用.updateIn()
和创建一个谓词函数,用于搜索指定节点并对其进行更新。根据您的规范实施DFS或BFS。如果您正在处理列表结构,那么.find()
和.findIndex()
也可能是非常有价值的合成工具。
您可能还需要考虑另一件事 - 展平您的数据。它不是一个受欢迎的,但它可以完成工作,也可以更容易使用很多UI的东西。
在图表的示例中,将其展平为List
地图,并让每个项目都保留其子女和/或父母的uuids的参考。这样,您就可以遍历List并找到需要根据简单谓词更新的元素。