使用Ramda在嵌套对象中进行数组过滤

时间:2020-04-30 21:55:28

标签: javascript ramda.js

我们假设我们有以下对象:

const sample = {
  foo: {
    tags: [
      'aaa', 'bbb'
    ],
    a: 1,
    b: 10
  },
  bar: {
    tags: [
      'ccc', 'ddd'
    ],
    a: 11,
    b: 100
  }
}

如何使用ramda从对象sample删除特定的标签值? 我已经做到了

/// Remove tag named 'aaa'
R.map(v => R.assoc('tags', R.without('aaa', v.tags), v), sample)

可以达到预期的结果,但是如何消除map内的lamda(和创建的闭包)?

2 个答案:

答案 0 :(得分:1)

您可以使用evolve代替assocassoc期望在提供的对象上设置属性和纯值,而evolves期望产生新值的属性和函数(尽管语法略有不同)。

R.map(R.evolve({tags: R.without('aaa')}), sample)

答案 1 :(得分:1)

您可以R.evolve每个对象,并使用R.without转换tags的值:

const { map, evolve, without } = R

const fn = map(evolve({
  tags: without('aaa')
}))

const sample = {"foo":{"tags":["aaa","bbb"],"a":1,"b":10},"bar":{"tags":["ccc","ddd"],"a":11,"b":100}}

const result = fn(sample)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>