我有一个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属性应该保留。
当前回答
最短路径(lodash v4):
_.pickBy(my_object)
其他回答
你可以简单地用_连接_.省略()。isUndefined和_。isNull组合,并获得懒惰求值的结果。
Demo
var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
2016年3月14日更新:
正如dylants在评论部分中提到的,您应该使用_.omitBy()函数,因为它使用谓词而不是属性。对于lodash 4.0.0及以上版本,您应该使用此选项。
DEMO
var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
2016年6月1日更新:
正如Max Truxa所评论的,lodash已经提供了一个替代的_。isNil,检查null和undefined:
var result = _.omitBy(my_object, _.isNil);
我能够在深层对象中做到这一点,其中包括数组,只有一个lodash函数,transform。
注意,双重不相等(!= null)是有意的,因为它也将匹配undefined, typeof 'object'检查也是如此,因为它将匹配object和array。
这只用于不包含类的普通数据对象。
const cloneDeepSanitized = (obj) =>
Array.isArray(obj)
? obj.filter((entry) => entry != null).map(cloneDeepSanitized)
: transform(
obj,
(result, val, key) => {
if (val != null) {
result[key] =
typeof val === 'object' ? cloneDeepSanitized(val) : val;
}
},
{},
);
我遇到了一个类似的问题,从一个对象中删除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(当它在数组中找到时)。
var my_object = { a:undefined, b:2, c:4, d:undefined };
var newObject = _.reject(my_collection, function(val){ return _.isUndefined(val) })
//--> newCollection = { b: 2, c: 4 }
只是:
_.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); }));