JLa*_*oie 145 javascript object lodash
我有一个Javascript对象,如:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Run Code Online (Sandbox Code Playgroud)
如何删除所有未定义的属性?
rye*_*lar 202
您可以简单地_.omit()使用_.isUndefined和_.isNull组合链接,并通过延迟评估获得结果.
var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
Run Code Online (Sandbox Code Playgroud)
2016年3月14日更新:
正如评论部分中的dylants所提到的,您应该使用该_.omitBy()函数,因为它使用谓词而不是属性.您应该将此用于lodash版本4.0.0及更高版本.
var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
Run Code Online (Sandbox Code Playgroud)
2016年6月1日更新:
正如Max Truxa评论的那样,lodash已经提供了另一种选择_.isNil.
var result = _.omitBy(my_object, _.isNil);
Run Code Online (Sandbox Code Playgroud)
Tx3*_*Tx3 163
如果要删除所有falsey值,那么最紧凑的方法是:
_.pick(obj, _.identity);
Run Code Online (Sandbox Code Playgroud)
例如(Lodash 3.x):
_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
Run Code Online (Sandbox Code Playgroud)
对于Lodash 4.x:
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
Run Code Online (Sandbox Code Playgroud)
Jav*_*ish 31
如果您使用的是lodash,则可以使用_.compact(array)从数组中删除所有错误值.
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
https://lodash.com/docs/4.17.4#compact
Phi*_*Lho 15
只是:
_.omit(my_object, _.isUndefined)
Run Code Online (Sandbox Code Playgroud)
上面没有考虑到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); }));
Run Code Online (Sandbox Code Playgroud)
nSi*_*mon 11
要完成其他答案,在lodash 4中只忽略undefined和null(而不是像属性一样false),你可以使用谓词_.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);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>Run Code Online (Sandbox Code Playgroud)
正确答案是:
_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)
Run Code Online (Sandbox Code Playgroud)
结果是:
{b: 1, d: false}
Run Code Online (Sandbox Code Playgroud)
其他人在这里给出的替代方法:
_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);
Run Code Online (Sandbox Code Playgroud)
还将删除false此处不需要的值。
对于深层嵌套对象,您可以使用我的 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
};
Run Code Online (Sandbox Code Playgroud)
从对象中删除未定义、null 和空字符串
_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');
Run Code Online (Sandbox Code Playgroud)
我在undefined从对象中删除时遇到了类似的问题(深深地),并发现如果你可以转换你的普通旧对象并使用 JSON,一个快速而肮脏的帮助函数看起来像这样:
function stripUndefined(obj) {
return JSON.parse(JSON.stringify(obj));
}
Run Code Online (Sandbox Code Playgroud)
“...如果在转换过程中遇到未定义的函数或符号,则将其省略(在对象中找到时)或删失为 null(在数组中找到时)。”
使用纯 JavaScript:(虽然 Object.entries 是 ES7,Object.assign 是 ES6;但等效的 ES5 只使用 Object.keys 应该也是可行的);还要注意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 }
Run Code Online (Sandbox Code Playgroud)
编辑:以下是仅包含 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 }
Run Code Online (Sandbox Code Playgroud)
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 }
Run Code Online (Sandbox Code Playgroud)
或仅在一次减少:
> 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 }
Run Code Online (Sandbox Code Playgroud)
更新:有人想要递归?也不是那么难,只需要额外检查 isObject,并递归调用自身:
> 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 } }
Run Code Online (Sandbox Code Playgroud)
我的结论:如果纯 Javascript 可以做到,我会避免任何第三方库依赖项:
由于你们中的一些人可能已经找到了专门删除only 的问题undefined,您可以使用:
Lodash 方法的组合
_.omitBy(object, _.isUndefined)
Run Code Online (Sandbox Code Playgroud)rundef仅删除undefined属性的包
rundef(object)
Run Code Online (Sandbox Code Playgroud)如果您需要递归删除undefined属性,该rundef包还有一个recursive选项。
rundef(object, false, true);
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅文档。