Запрет Ramda.omit преобразовывать массивы в объекты - PullRequest
1 голос
/ 01 мая 2020

Я использую R.omit в рекурсивной функции, передавая ей как объекты, так и массивы. Проблема возникает при передаче ему массива, когда он преобразуется в объект:

const shouldBeArray = R.omit(['fill'])(['bla']);

Здесь shouldBeArray становится { '0': 'bla' }

Как мне сохранить массивы как массивы ? Это не имеет большого значения в контексте javascript, однако при запуске объекта через JSON.stringify структура становится явно другой.

Вот вся функция:

  function removeColors(svgObj) {
    return R.when(
      R.is(Object),
      R.pipe(
        R.omit(['fill']),
        R.map(removeColors)
      )
    )(svgObj);
  }

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Используйте R.unless, чтобы пропустить, только если объект не является массивом:

const { curry, when, is, pipe, unless, omit, map } = R

const omitDeep = curry((keys, obj) => when(
  is(Object),
  pipe(
    unless(is(Array), omit(keys)),
    map(omitDeep(keys))
  )
)(obj))

const result = omitDeep(['fill'], {
  arr: ['bla'],
  p1: {
    arr: [{ fill: 'blue', background: 'red' }],
    fill: 'green'
  },
  fill: 'yellow'
})

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
1 голос
/ 01 мая 2020

Попробуйте использовать R.without() или R.difference()

console.log(R.without(['kromid'])(['bla']))

console.log(R.difference(['bla'])(['kromid']))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
...