Фильтрация массивов во вложенном объекте с использованием ramda - PullRequest
0 голосов
/ 01 мая 2020

Предположим, что у нас есть следующий объект:

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

Как можно удалить указанное значение тега c из объекта sample с помощью ramda? Я сделал это

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

, который достигает желаемого результата, но как я могу устранить лямду (и созданное замыкание) внутри карты?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете 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>
1 голос
/ 01 мая 2020

Вы можете использовать evolve вместо assoc. assoc ожидает, что свойство и обычное значение будут установлены для предоставленного объекта, тогда как evolves ожидает, что свойство и функция будут создавать новое значение (хотя и в несколько ином синтаксисе).

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