我正在尝试使用 ramda 通过给定的 id 删除一个对象,这是我的 JSON 数据格式:
{
id: 1,
name: "orders",
queries: [{
id: 120,
name: "test1",
queries: [{
id: 141,
name: "order1"
}]
}, {
id: 121,
name: "test2",
}, {
id: 115,
name: "test3",
}, {
id: 122,
name: "test4",
}, {
id: 125,
name: "test5",
queries: [{
id: 126,
name: "order2"
}]
}, {
id: 143,
name: "test6"
}, {
id: 144,
name: "test7"
queries: [{
id: 145,
name: "order3"
}]
}, {
id: 146,
name: "test8"
}]
}
在上面的示例中,给定 id: 141
,我想在查询中删除该对象。
我试过使用带过滤器的嵌套 map ,但似乎不起作用。任何人都可以提供一些线索吗?
最佳答案
如果要删除的 id
有可能是第一个节点,最好将顶级对象包装在数组中。这也有助于递归解决方案。
首先我们可以使用R.reject
为给定的对象列表过滤掉具有匹配 id
的所有元素。然后我们可以使用R.map
和 R.evolve
以递归方式将相同的函数应用于每个对象中的 queries
列表。
const removeId = (id, objs) => R.map(
R.evolve({ queries: xs => removeId(id, xs) }),
R.reject(R.propEq('id', 141), objs)
)
您可以在下面的代码段中看到使用您的数据的示例。
const data = [{
id: 1,
name: "orders",
queries: [{
id: 120,
name: "test1",
queries: [{
id: 141,
name: "order1"
}]
}, {
id: 121,
name: "test2",
}, {
id: 115,
name: "test3",
}, {
id: 122,
name: "test4",
}, {
id: 125,
name: "test5",
queries: [{
id: 126,
name: "order2"
}]
}, {
id: 143,
name: "test6"
}, {
id: 144,
name: "test7",
queries: [{
id: 145,
name: "order3"
}]
}, {
id: 146,
name: "test8"
}]
}]
const removeId = (id, objs) => R.map(
R.evolve({ queries: xs => removeId(id, xs) }),
R.reject(R.propEq('id', 141), objs)
)
const result = removeId(141, data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.min.js"></script>
关于ramda.js - lambda : Delete object in nested structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971709/