我有一个Javascript对象像:
var my_object = { a:undefined, b:2, c:4, d:undefined };
如何删除所有未定义的属性?False属性应该保留。
我有一个Javascript对象像:
var my_object = { a:undefined, b:2, c:4, d:undefined };
如何删除所有未定义的属性?False属性应该保留。
当前回答
默认情况下,pickBy使用identity:
_.pickBy({ a: null, b: 1, c: undefined, d: false });
其他回答
以下是我采用的lodash方法:
_(my_object)
.pairs()
.reject(function(item) {
return _.isUndefined(item[1]) ||
_.isNull(item[1]);
})
.zipObject()
.value()
函数的作用是:将输入对象转换为键/值数组数组。这样做是为了更容易使用reject()来消除未定义值和空值。之后,剩下的是没有被拒绝的对,这些是zipObject()的输入,它为您重建对象。
最短路径(lodash v4):
_.pickBy(my_object)
我遇到了一个类似的问题,从一个对象中删除undefined(深度),并发现如果你可以转换你的普通旧对象并使用JSON,一个快速而肮脏的帮助函数将如下所示:
function stripUndefined(obj) {
return JSON.parse(JSON.stringify(obj));
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
"...如果在转换过程中遇到未定义的函数或符号,它要么被省略(当它在对象中找到时),要么被删除为null(当它在数组中找到时)。
只是:
_.omit(my_object, _.isUndefined)
上面没有考虑到空值,因为它们在原始示例中没有出现,只在主题中提到过,但我保留了它,因为它很优雅,可能有它的用途。
下面是完整的示例,虽然不那么简洁,但更完整。
var obj = { a: undefined, b: 2, c: 4, d: undefined, e: null, f: false, g: '', h: 0 };
console.log(_.omit(obj, function(v) { return _.isUndefined(v) || _.isNull(v); }));
考虑到undefined == null,我们可以这样写:
let collection = {
a: undefined,
b: 2,
c: 4,
d: null,
}
console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }
JSBin例子