如何使用lodash从对象中删除未定义和空值?

253

我有一个类似于以下的Javascript对象:

var my_object = { a:undefined, b:2, c:4, d:undefined };

如何删除所有未定义的属性?假属性应该保留。

27个回答

6

我遇到了一个类似的问题,需要从一个对象中(深度)移除undefined,我发现如果你可以将普通对象转换为JSON格式并使用它,那么一个快速而简单的辅助函数看起来会像这样:

function stripUndefined(obj) {
  return JSON.parse(JSON.stringify(obj));
}

如果在转换过程中遇到undefined、函数或符号,则会被省略(当它在对象中时)或被替换为null(当它在数组中时)。更多内容请参见:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description

这太棒了 :D - zeekrey

5

如果您想专门删除只有undefined,可以使用以下代码:

  • a combination of Lodash methods

    _.omitBy(object, _.isUndefined)
    
  • the rundef package, which removes only undefined properties

    rundef(object)
    

如果你需要递归地删除 undefined 属性,rundef 包还提供了一个 recursive 选项。

rundef(object, false, true);

查看文档以获取更多详细信息。


4

使用最短的方式(lodash v4)删除所有假值,包括nullundefined

_.pickBy(my_object)

2
使用 pickBy 删除值为 false 的键,pickBy 使用第二个参数作为默认标识。 - Ardit Hyka

3
这里是我会采用的 lodash 方法:

_(my_object)
    .pairs()
    .reject(function(item) {
        return _.isUndefined(item[1]) ||
            _.isNull(item[1]);
    })
    .zipObject()
    .value()

pairs()函数将输入对象转换为键值数组的数组。这样做是为了更容易使用reject()来消除undefinednull值。然后,您将剩下未被拒绝的键值对作为zipObject()的输入,该函数会为您重建对象。


自从 lodash 4 版本以后,新增了 _.isNil 方法,可以同时检查 undefinednull - Tim Baas

3

考虑到 undefined == null,我们可以这样写:

let collection = {
  a: undefined,
  b: 2,
  c: 4,
  d: null,
}

console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }

JSBin example


1
重新审视这段代码...不确定为什么,但这一次我必须使用 _.omitBy... json = _.omitBy(json, (it) => it == null); - danday74

3
你也可以使用 Object.entriesArray.prototype.filter
const omitNullish = (object) => 
   Object.fromEntries(
       Object.entries(object).filter(([, value]) => value != null)
   )

omitNullish({ a: null, b: 1, c: undefined, d: false, e: 0 }) // { b: 1, d: false, e: 0}

如果你想使用lodash,他们在v5中正在删除omit功能,因此另一种选择是使用fp/pickBy以及isNilnegate

import pickBy from 'lodash/fp/pickBy'
import isNil from 'lodash/isNil';
import negate from 'lodash/negate';


const omitNullish = pickBy(negate(isNil))

omitNullish({ a: null, b: 1, c: undefined, d: false, e: 0 }) // { b: 1, d: false, e: 0}

omitNullish 不是一个函数。 - Iulian Pinzaru
在哪个代码块? - manish
我可能错了,但我将您的代码转换为使用“_”下划线(这必须与从lodash导入相同)。输入lodash.com并打开浏览器控制台以运行您的代码,结果出现了错误。我正在运行以下代码:omitNullish({ a: null, b: 1, c: undefined, d: false, e: 0 });``` 也许我错过了什么或误解了...如果我错了,请纠正我。谢谢 - Iulian Pinzaru
1
'lodash/fp/pickBy'和'lodash/pickBy'不同,注意导入中的'fp',它表示pickBy的函数式编程变体。这可能是您遇到此错误的原因。有关更多信息,您可以阅读有关'lodash/fp'的更多内容:https://github.com/lodash/lodash/wiki/FP-Guide - manish
1
如果您想探索,这是一个可工作的版本:https://codesandbox.io/s/lodash-fp-forked-rrkt0?file=/src/index.js - manish
1
谢谢澄清!现在明白了 :) - Iulian Pinzaru

3

我喜欢使用_.pickBy,因为你可以完全控制你要移除的内容:

var person = {"name":"bill","age":21,"sex":undefined,"height":null};

var cleanPerson = _.pickBy(person, function(value, key) {
  return !(value === undefined || value === null);
});

来源:https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object

如何使用 Lodash 删除 JavaScript 对象中的 undefined 值?

// 例子对象
let obj = {
  'name': 'John',
  'age': 30,
  'city': undefined,
  'country': null
};

// 过滤 undefined 和 null 值
_.pickBy(obj, _.identity);

// 移除 undefined 和 null 值
_.omitBy(obj, _.isNil);

2

您可以使用 Lodash 来删除 null 和 undefined 对象,但是您需要知道要使用哪种 Lodash 方法。许多开发人员使用 isNil 来删除 Null 和 undefined 对象,但是此函数不会删除空对象 ('')。

您可以使用 isEmpty 来删除 Null、Undefined 和 ''。

import pickBy from 'lodash/fp/pickBy'
import negate from 'lodash/negate';
import isEmpty from 'lodash/isEmpty';

const omitNullish = pickBy(negate(isEmpty));

      addressObject = {
      "a": null,
      "c": undefined,
      "d": "",
      "e": "test1",
      "f": "test2
    }

 const notNullObjects = omitNullish(addressObject);
 
 console.log(notNullObjects); 

你将会得到这个对象: { "e": "test1", "f": "test2 }

这似乎也会删除数字,因此如果您有数字,我不建议使用此方法。 - Pencilcheck

2

pickBy 默认使用 identity

最初的回答

_.pickBy({ a: null, b: 1, c: undefined, d: false });

我喜欢@Tx3的答案的这个简短版本。非常好用! - Jordan

1
使用lodash(或underscore)可以这样做:
var my_object = { a:undefined, b:2, c:4, d:undefined, e:null };

var passedKeys = _.reject(Object.keys(my_object), function(key){ return _.isUndefined(my_object[key]) || _.isNull(my_object[key]) })

newObject = {};
_.each(passedKeys, function(key){
    newObject[key] = my_object[key];
});

否则,使用纯JavaScript,您可以执行以下操作。
var my_object = { a:undefined, b:2, c:4, d:undefined };
var new_object = {};

Object.keys(my_object).forEach(function(key){
    if (typeof my_object[key] != 'undefined' && my_object[key]!=null){
        new_object[key] = my_object[key];
    }
});

不要使用假值测试,因为不仅 "undefined" 或 "null" 将被拒绝,其他假值例如 "false"、"0"、空字符串、{} 也会被拒绝。因此,为了简单易懂,我选择使用上述编码的显式比较。

1
这并不是递归。 - user3743222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接