Ramda 删除嵌套的空值

Skh*_*haz 4 javascript ramda.js

我想从对象中删除所有空值。我们假设:

const data = {
  key1: 'ok',
  key2: null,
  key3: '', // should be removed too
  key4: {
    inner_key1: 'aaa',
    inner_key2: null
  }
}
Run Code Online (Sandbox Code Playgroud)

我所做的是这个

const clean = R.reject(R.either(R.isNil, R.isEmpty))
Run Code Online (Sandbox Code Playgroud)

还有这个作品:

{"key1":"ok","key4":{"inner_key1":"aaa","inner_key2":null}}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,除了嵌套对象之外,inner_key2 也存在,并且应该被过滤掉

使用 ramda,我怎样才能删除这个嵌套值?

Ori*_*ori 5

创建一个递归函数,在清理对象后迭代属性,并对每个属性(即一个对象)调用 clean:

const { pipe, reject, either, isNil, isEmpty, map, when, is } = R

const clean = o => pipe(
  reject(either(isNil, isEmpty)),
  map(when(is(Object), clean))
)(o)

const data = {"key1":"ok","key2":null,"key3":"","key4":{"inner_key1":"aaa","inner_key2":null}}
const result = clean(data)

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
Run Code Online (Sandbox Code Playgroud)