首页 > 解决方案 > lodash 可以删除仅包含 null 或 undefined 的数组吗?

问题描述

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

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 或 undefined 的键,还可以删除值为仅包含 undefined 或 null 的数组的键?我知道一般来说有很多方法可以做到这一点,我只是想知道 lodash 是否有一些方法可以做到这一点。

标签: javascriptlodash

解决方案


对于对象(包括数组)和原语,您需要使用_.omitBy()with 。在检查数组是否为空以忽略值之前,您还应该数组:_.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>


推荐阅读