我正在尝试使用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
,我想在查询中删除该对象。
我尝试过使用嵌套地图和过滤器,但似乎无效。任何人都可以提供一些线索?
答案 0 :(得分:5)
如果要删除的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>
&#13;