我有一个看起来像这样的数据对象:
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是否有某种方法可以完成这项工作。
答案 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])