ramda.js - lambda : Delete object in nested structure

标签 ramda.js

我正在尝试使用 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.mapR.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/

相关文章:

javascript - 在 JavaScript 中使用 transduce 进行优化 - Transducers 和 Ramda

javascript - 如何删除对象中特定键的所有实例?

javascript - Ramda GroupBy - 如何按任何 Prop 分组

javascript - 附加到字符串 Ramda.js 的末尾

javascript - lambda : How to remove keys in objects with empty values?

javascript - 仅当对象存在时使用 Ramda 调用对象的嵌套方法

javascript - 如何使用 Babel 在 Rollup 中设置 Ramda(以使用 ES6 导入)

javascript - Ramda.js 重构

javascript - 使用 Ramda `range` 进行复制,但需要每隔 3 个插入一次(React)

javascript - 将逻辑 NOT 应用于 propEq 并在 ramda 中进行过滤