Ramda:删除嵌套结构中的对象

时间:2016-10-11 06:42:43

标签: 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,我想在查询中删除该对象。

我尝试过使用嵌套地图和过滤器,但似乎无效。任何人都可以提供一些线索?

1 个答案:

答案 0 :(得分:5)

如果要删除的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>
&#13;
&#13;
&#13;