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

Dam*_*ian 60 javascript field object undefined

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

> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }
Run Code Online (Sandbox Code Playgroud)

我遇到了两个解决方案:

_.each(query, function removeUndefined(value, key) {
  if (_.isUndefined(value)) {
    delete query[key];
  }
});
Run Code Online (Sandbox Code Playgroud)

要么:

_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
Run Code Online (Sandbox Code Playgroud)

Rot*_*eti 103

使用ES6箭头功能和三元运算符的单线程:

Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : '');
Run Code Online (Sandbox Code Playgroud)

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

Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])
Run Code Online (Sandbox Code Playgroud)

jsbin

使用if表达式的相同示例:

Object.keys(obj).forEach(key => {
  if (obj[key] === undefined) {
    delete obj[key];
  }
});
Run Code Online (Sandbox Code Playgroud)

如果你想删除__CODE__,__CODE____CODE__使用__CODE__替代__CODE__.

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

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(key => {
    if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
    else if (obj[key] === undefined) delete obj[key];
  });
  return obj;
};
Run Code Online (Sandbox Code Playgroud)

jsbin

  • 你实际上甚至不需要三元运算符.相反,你可以做`(obj [key] === undefined && delete obj [key])`这个工作的原因是因为并使用短路评估,所以一旦第一次检查失败,第二次甚至不被评估. (10认同)
  • 只是警告,递归函数会破坏其中包含数组的对象。它需要额外的情况来处理数组。 (3认同)
  • 更好!我更新了答案.谢谢你提到它:) (2认同)
  • !! obj [key]`不仅会删除`null`,`''`和`undefined`,还会删除`0`和`NaN`。 (2认同)
  • 因此,这不是一个代码搜寻站点-干净,可读的代码比*尽可能短的代码*重要得多。当您需要对表达式的结果做某事时,条件运算符是合适的,在这里不是这种情况。如果您只需要模仿`if / else`,我认为最好只是使用`if / else`。 (2认同)

nma*_*ran 48

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

要删除undefined对象中的道具,我们就像这样使用

JSON.parse(JSON.stringify(obj));

输出: {a: 1, c: 3}

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

Thi*_*man 43

我更喜欢使用像Lodash这样的东西:

import { pickBy, identity } from 'lodash'

const cleanedObject = pickBy(originalObject, identity)
Run Code Online (Sandbox Code Playgroud)

请注意,标识函数是正确的,x => x并且对于所有伪值,其结果将为false .所以这删除了undefined,"",0,null,...

如果您只想undefined删除值,则可以执行以下操作:

const cleanedObject = pickBy(originalObject, v => v !== undefined)
Run Code Online (Sandbox Code Playgroud)

它为您提供了一个新对象,通常比改变原始对象更好,就像其他一些答案所暗示的那样.

  • 或者您的代码在后端运行,您不必担心包的大小。或者您的前端捆绑器使用 tree shake 和/或重写 Lodash 导入(Babel 插件),以便您只导入您使用的内容。所以我认为说 Lodash 从定义上来说太臃肿是不正确的。这取决于。 (11认同)
  • `pickBy` 的第二个参数默认为 `identity`,因此如果需要,可以将其简化为 `const cleanObject = pickBy(originalObject)`。 (5认同)

小智 12

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

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

你可以将其添加为null''更严格的清洗.


pti*_*tim 12

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

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}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我使用别名`_acc` 以避免eslint 错误[no-param-reassign](http://eslint.org/docs/rules/no-param-reassign) (3认同)
  • `Object.keys(obj).reduce((acc, key) => obj[key] === undefined ? {...acc} : {...acc, [key] : obj[key]} , { })` (3认同)

jfr*_*d00 8

这是一个简单的 javascript(不需要库)解决方案:

function removeUndefinedProps(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
            delete obj[prop];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

工作演示:http://jsfiddle.net/jfriend00/djj5g5fu/