如何使用lodash从对象中删除undefined和null值?

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及更高版本.

DEMO

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)

  • 从lodash 4.0.0开始,您可以使用[`_.isNil`](https://lodash.com/docs#isNil)而不是链接`_.isUndefined`和`_.isNull`.这使它更短:`var result = _.omitBy(my_object,_. isNil);` (24认同)
  • 那些使用更新版本的lodash的人应该使用`omitBy`函数而不是`omit`.所以`_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();` (6认同)
  • 对于某些人来说可能微不足道,但对于其他人来说很重要:这不是递归!如果你想省略嵌套对象中的 nil 值,你必须实现递归调用! (4认同)
  • Lodash 的 omitBy 性能低于 pickBy,因此应该优先选择后者,并且 iteratee 函数中的条件相反。上面接受的答案是正确的。 (2认同)
  • OP 的问题仅指定了 `null` 和 `undefined` 值。`identity` 谓词也将删除 `false` 值,所以如果你只是根据问题的意图来判断它,那么我的答案不会有问题。此外,如果我们谈论“性能”,默认情况下,`omitBy` 会简单地调用带有否定 `identity` 谓词的 `pickBy`。所以,就性能而言,它太小了,意义不大。 (2认同)

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)

  • 请注意,在lodash 4中,这应该是`_.pickBy(obj,_.identity);` (59认同)
  • Plaese注意这种方法也会删除假值. (22认同)
  • 除了删除 false 之外,它还将删除以 0 和 '' 作为值的属性......不是一个好主意。 (15认同)
  • 这个答案不正确,因为它还删除了虚假值。在下面检查我的答案。 (9认同)
  • 注意,这将删除具有"false"值的布尔属性 (5认同)
  • 为什么这是一个答案?它没有回答问题,它还删除了“0”和“false”值。 (3认同)

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

  • compact适用于数组,但问题是关于对象 (31认同)
  • @Sammi,在这种情况下你可以使用`_.pickBy(object,_.isNumber)`. (2认同)

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)

  • 请注意,这是针对Lodash v.3.对于v.4,你必须使用`_.omitBy`. (5认同)

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)

  • 如果您不想删除 `0`、`''`、`false` 值,这是最好的解决方案。您还可以将回调缩短为“v =&gt; v != null”。 (2认同)
  • 简单的解决方案。这次真是万分感谢。 (2认同)

小智 9

根据lodash文档:

_.compact(_.map(array, fn))
Run Code Online (Sandbox Code Playgroud)

您也可以过滤掉所有空值


Tia*_*olo 9

正确答案是:

_.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此处不需要的值。

  • @mqliutie 正如预期的那样。 (2认同)

1ns*_*nct 7

对于深层嵌套对象,您可以使用我的 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)


Amr*_*mar 7

从对象中删除未定义、null 和空字符串

_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');
Run Code Online (Sandbox Code Playgroud)


jer*_*ome 6

我在undefined从对象中删除时遇到了类似的问题(深深地),并发现如果你可以转换你的普通旧对象并使用 JSON,一个快速而肮脏的帮助函数看起来像这样:

function stripUndefined(obj) {
  return JSON.parse(JSON.stringify(obj));
}
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description

“...如果在转换过程中遇到未定义的函数或符号,则将其省略(在对象中找到时)或删失为 null(在数组中找到时)。”


use*_*998 6

使用纯 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 可以做到,我会避免任何第三方库依赖项:


d4n*_*yll 5

由于你们中的一些人可能已经找到了专门删除only 的问题undefined,您可以使用:


如果您需要递归删除undefined属性,该rundef包还有一个recursive选项。

rundef(object, false, true);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅文档