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>