lodash是否可以删除仅包含null或undefined的数组?

时间:2019-01-14 16:40:03

标签: javascript lodash

我有一个看起来像这样的数据对象:

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value"
}

最后我需要这样做:

{
    "four":     "valid value"
}

我正在使用lodash尝试完成此任务,这使我在其中发挥了作用:

obj = _.pick(obj, _identity);

哪个给我:

{
    "three":    [undefined],
    "four":     "valid value"
}

是否存在以lodash为中心的方法,不仅可以删除其值为空或未定义的键,还可以删除其值是仅包含未定义或为null的数组的键?我知道通常有很多方法可以做到这一点,我只是想知道lodash是否有某种方法可以完成这项工作。

2 个答案:

答案 0 :(得分:4)

您需要将_.omitBy()_.empty()一起用于对象(包括数组),并将!value用于基元。在检查数组是否为空以忽略_.compact()值之前,还应该falsy个数组:

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value",
}

var fn = o => _.omitBy(o, v => _.isObject(v) ? 
  _.isEmpty(_.isArray(v) ? _.compact(v) : v)
  : 
  !v
)

var result = fn(obj)

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

如果要删除falsy值和嵌套对象/数组中的空数组/对象,请递归使用_.transform()。使用_.compact()从数组中删除falsy的值,并使用_.isEmpty()Boolean进行检查:

如果您需要递归解决方案,则可以使用_.transform()

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value",
    "five":     [undefined, 1],
    "six":      [{ a: null, b: [] }, undefined]
}

var cleanArray = (o) => _.isArray(o) ? _.compact(o) : o;

var clean = o => _.transform(o, (r, v, k) => {
  var isObject = _.isObject(v)
  var val = isObject ? cleanArray(clean(v)) : v
  var keep = isObject ? !_.isEmpty(val) : Boolean(val)
  
  if(keep) r[k] = val
})

var result = clean(obj)

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

答案 1 :(得分:2)

不使用

  

使用SameValueZero创建一个排除所有给定值的数组   平等比较。

https://lodash.com/docs/#without

obj = _.without(obj, undefined,null,[undefined])