Ramda:删除嵌套结构中的对象
Ramda: Delete object in nested structure
我正在尝试使用 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
,我想在查询中删除该对象。
我试过使用带过滤器的嵌套地图,但似乎不起作用。任何人都可以提供一些线索吗?
如果要删除的 id
有可能是第一个节点,最好将顶级对象包装在数组中。这也将有助于递归解决方案。
首先我们可以使用R.reject
to filter out all elements with a matching id
for a given list of objects. Then we can use R.map
and 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 删除给定 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
,我想在查询中删除该对象。
我试过使用带过滤器的嵌套地图,但似乎不起作用。任何人都可以提供一些线索吗?
如果要删除的 id
有可能是第一个节点,最好将顶级对象包装在数组中。这也将有助于递归解决方案。
首先我们可以使用R.reject
to filter out all elements with a matching id
for a given list of objects. Then we can use R.map
and 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>