Javascript - 从对象中删除未定义的字段

IT技术 javascript object field undefined
2021-03-04 19:56:02

有没有一种干净的方法可以从对象中删除未定义的字段?

IE

> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }

我遇到了两个解决方案:

_.each(query, function removeUndefined(value, key) {
  if (_.isUndefined(value)) {
    delete query[key];
  }
});

或者:

_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
6个回答

使用ES6箭头函数和三元运算符的单行

Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : {});

或者使用短路评估而不是三元:(@Matt Langlois,感谢您提供信息!)

Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])

使用 if 语句的相同示例:

Object.keys(obj).forEach(key => {
  if (obj[key] === undefined) {
    delete obj[key];
  }
});

如果您还想从嵌套对象中删除项目,您可以使用递归函数:

const removeEmpty = (obj) => {
  let newObj = {};
  Object.keys(obj).forEach((key) => {
    if (obj[key] === Object(obj[key])) newObj[key] = removeEmpty(obj[key]);
    else if (obj[key] !== undefined) newObj[key] = obj[key];
  });
  return newObj;
};
您实际上甚至不需要三元运算符。相反,您可以执行(obj[key]===undefined&& delete obj[key])操作的原因是因为并使用了短路评估,因此一旦第一次检查失败,第二次甚至不会被评估。
2021-04-25 19:56:02
甚至更好!我更新了答案。谢谢你提到它:)
2021-04-26 19:56:02
只是一个警告,递归函数会破坏其中包含数组的对象。它需要一个额外的案例来处理数组。
2021-05-05 19:56:02
!obj[key]不仅会删除null, ''and undefined,还会删除0and NaN
2021-05-10 19:56:02
SO 不是一个打代码的网站——干净、可读的代码比尽可能短的代码重要得多当你需要对表达式的结果做一些事情时,条件运算符是合适的,这里不是这种情况。如果你只是需要模仿if/else,我认为最好只是使用if/else.
2021-05-10 19:56:02

我更喜欢使用类似 Lodash 的东西:

import { pickBy, identity } from 'lodash'

const cleanedObject = pickBy(originalObject, identity)

请注意,恒等函数是公正的x => x,对于所有假值,其结果将为假所以这会删除 undefined, "", 0, null, ...

如果您只想undefined删除值,您可以这样做:

const cleanedObject = pickBy(originalObject, v => v !== undefined)

它为您提供了一个新对象,这通常比像其他一些答案所建议的那样对原始对象进行变异更可取。

的第二个参数pickBy默认为identity,因此const cleanedObject = pickBy(originalObject)如果需要,可以将其简化为
2021-04-28 19:56:02

使用 JSON 实用程序

概述

给定一个对象,如:

var obj = { a: 1, b: undefined, c: 3 }

要删除undefined对象中的props,我们可以使用嵌套的 JSON 方法 stringify 和 parse,如下所示:

JSON.parse(JSON.stringify(obj))

现场示例

var obj = { a: 1, b: undefined, c: 3 }
var output = JSON.parse(JSON.stringify(obj));

console.log(output)

限制和警告

取决于 Javascript 的实现方式。

  • 有可能undefined将被转换为null而不是仅仅被删除。
  • 嵌套ObjectArray将转换为字符串
  • Date,time值也转换为字符串

已测试

上面的代码在 Firefox、Chrome 和 Node 14.18.1 中进行了测试,并从所有 obj 数组中删除了“b”。我仍然建议谨慎使用此方法,除非您处于稳定的环境(例如云​​功能或 docker)中,否则我不会依赖此方法客户端。

简短但缓慢,仅适用于简单值。
2021-04-23 19:56:02
这将替换undefinedwithnull并且条目仍然存在。
2021-04-25 19:56:02
伙计们,这可能看起来很简单,但日期对象将被转换为字符串。谨防
2021-05-01 19:56:02
这比什么都重要。将代码格式化为字符串并将其解析回代码只是为了改变一些可以通过编程轻松完成的事情?无意的副作用(例如在 Date 上)和计算效率低下使得这个答案应该被 IMO 否决。
2021-05-07 19:56:02
@GlennPlas 添加 plnkr plnkr.co/edit/wP37G6BA5uJPSFz6xLTq?p=preview 检查浏览器控制台的输出
2021-05-08 19:56:02

因为它似乎没有被提及,所以这是我的首选方法,没有副作用或外部依赖:

const obj = {
  a: 1,
  b: undefined
}

const newObject = Object.keys(obj).reduce((acc, key) => {
  const _acc = acc;
  if (obj[key] !== undefined) _acc[key] = obj[key];
  return _acc;
}, {})

console.log(newObject)
// Object {a: 1}

我开始使用filter+forEach并最终将其转换为reduce这样的。+1
2021-04-21 19:56:02
Object.keys(obj).reduce((acc, key) => obj[key] === undefined ? {...acc} : {...acc, [key] : obj[key]} , {})
2021-05-03 19:56:02
顺便说一句,我使用别名是_acc为了避免 eslint 错误no-param-reassign
2021-05-11 19:56:02

该解决方案还避免了hasOwnProperty()作为Object.keys返回给定对象的自己的枚举的属性的阵列。

Object.keys(obj).forEach(function (key) {
 if(typeof obj[key] === 'undefined'){
    delete obj[key];
  }
});

您可以添加它作为null''进行更严格的清洁。