我有一个类似于以下的Javascript对象:
var my_object = { a:undefined, b:2, c:4, d:undefined };
如何删除所有未定义的属性?假属性应该保留。
我有一个类似于以下的Javascript对象:
var my_object = { a:undefined, b:2, c:4, d:undefined };
如何删除所有未定义的属性?假属性应该保留。
_.omit()
链接 _.isUndefined
和 _.isNull
组合函数,并通过惰性求值获取结果。
演示var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
2016年3月14日更新::
正如在评论区中dylants提到的那样,您应该使用_.omitBy()
函数,因为它使用谓词而不是属性。 您应该在 lodash 版本 4.0.0
及以上使用此函数。
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 4.x及更高版本:
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
对于 遗留的 Lodash 3.x 版本:
_.pick(obj, _.identity);
_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
_.pickBy(obj, _.identity);
。 - Tom Spencer正确答案是:
_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)
这导致:
{b: 1, d: false}
其他人提供的替代方案:
_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);
将删除这里不需要的false
值。
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
,对象的属性b
中的b
和c
将不被移除。 - mqliutie_.compact(array)
从数组中删除所有假值。_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
_.pickBy(object, _.isNumber)
。 - John Rix只是:
_.omit(my_object, _.isUndefined)
上述内容未考虑null
值,因为它们在原始示例中缺失且只在主题中提到,但我将保留它,因为它很优雅且可能有其用途。
以下是完整的示例,不那么简洁,但更加完整。
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); }));
_.omitBy
。 - PhiLho _.pickBy
中使用谓词:
_.pickBy(obj, v!== null && v!== undefined)
const obj = { a: undefined, b: 123, c: true, d: false, e: null};
const filteredObject = _.pickBy(obj, v => v !== null && v !== undefined);
console.log = (obj) => document.write(JSON.stringify(filteredObject, null, 2));
console.log(filteredObject);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
0
、''
、false
值,那么这是最佳解决方案。此外,您可以将回调缩短为 v => v != null
。 - SimpleJ根据Lodash文档:
_.compact(_.map(array, fn))
同时,您可以筛选掉所有的空值。
如果你需要处理深度嵌套的对象,可以使用我为lodash > 4编写的代码片段。
const removeObjectsWithNull = (obj) => {
return _(obj)
.pickBy(_.isObject) // get only objects
.mapValues(removeObjectsWithNull) // call only for values as objects
.assign(_.omitBy(obj, _.isObject)) // save back result that is not object
.omitBy(_.isNil) // remove null and undefined from object
.value(); // get value
};
isPlainObject
替换了isObject
的两个实例,看起来问题得到了解决。 - Daniel J. Lewis纯JavaScript实现:(虽然Object.entries是ES7特性,Object.assign是ES6特性;但使用只有Object.keys的等效ES5应该也可以实现); 还要注意v != null
检查null和undefined两种情况;
> var d = { a:undefined, b:2, c:0, d:undefined, e: null, f: 0.3, s: "", t: false };
undefined
> Object.entries(d)
.filter(([ k, v ]) => (v != null))
.reduce((acc, [k, v]) => Object.assign(acc, {[k]: v}), {})
{ b: 2, c: 0, f: 0.3, s: '', t: false }
编辑:以下是仅使用ES5 Object.keys的版本:但通常在Node v8中使用ES7相当令人愉悦 ;-)
> Object.keys(d)
.filter(function(k) { return d[k] != null; })
.reduce(function(acc, k) { acc[k] = d[k]; return acc; }, {});
{ b: 2, c: 0, f: 0.3, s: '', t: false }
2017年10月更新:随着Node v8的发布(从v8.3开始),现在它支持对象展开符构造:
> var d = { a:undefined, b:2, c:0, d:undefined,
e: null, f: -0.0, s: "", t: false, inf: +Infinity, nan: NaN };
undefined
> Object.entries(d)
.filter(([ k, v ]) => (v != null))
.reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
或者仅在一个reduce中:
> Object.entries(d)
.reduce((acc, [k, v]) => (v==null ? acc : {...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
> function isObject(o) {
return Object.prototype.toString.call(o) === "[object Object]"; }
undefined
> function dropNullUndefined(d) {
return Object.entries(d)
.reduce((acc, [k, v]) => (
v == null ? acc :
{...acc, [k]: (isObject(v) ? dropNullUndefined(v) : v) }
), {});
}
> dropNullUndefined({a: 3, b:null})
{ a: 3 }
> dropNullUndefined({a: 3, b:null, c: { d: 0, e: undefined }})
{ a: 3, c: { d: 0 } }
我的结论是:如果纯JavaScript可以实现,我会避免使用任何第三方库依赖:
Object.fromEntries(Object.entries(d).filter(([ k, v ]) => (v != null)))
- ppierre_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');
omitBy
函数代替omit
函数。因此,应该使用_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
。 - dylants_.isNil
来代替链接_.isUndefined
和_.isNull
。这使得代码更加简洁:var result = _.omitBy(my_object, _.isNil);
- Max TruxaomitBy
比pickBy
性能差,所以应该优先选择后者,并且在迭代函数中反转条件。上面接受的答案就是正确的。 - Ernesto