Javascript - 从对象中删除未定义的字段[重复]

Posted

技术标签:

【中文标题】Javascript - 从对象中删除未定义的字段[重复]【英文标题】:Javascript - removing undefined fields from an object [duplicate] 【发布时间】:2014-10-14 18:51:36 【问题描述】:

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

> 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]) ))

【问题讨论】:

您的问题是什么?您的解决方案已经满足您的需求(分别是破坏性和非破坏性的)。 你想让它干净多少,它已经干净了! 我只会使用_.filter(obj, function(v) return _.isUndefined(v)) 我想知道这些答案中哪个最快? 您的 omit 示例简化为 _.omit(obj, _.isUndefined)(仅下划线) 【参考方案1】:

使用 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];
  
);

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

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]) 这样做的原因是因为它使用短路评估,所以一旦第一次检查失败,第二次甚至都不会被评估。 更好!我更新了答案。谢谢你提到它:) !obj[key] 不仅会删除null''undefined,还会删除0NaN SO 不是一个打代码的网站 - 干净、可读的代码比 尽可能短 代码更重要。当您需要对表达式的结果做一些事情时,条件运算符是合适的,这里不是这种情况。如果你只需要模仿if/else,我认为最好还是使用if/else 只是一个警告,递归函数会破坏其中包含数组的对象。它需要一个额外的案例来处理数组。【参考方案2】:

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

import  pickBy, identity  from 'lodash'

const cleanedObject = pickBy(originalObject, identity)

请注意,标识函数只是x => x,对于所有虚假值,其结果将为 false。所以这会删除 undefined, "", 0, null, ...

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

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

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

【讨论】:

pickBy 的第二个参数默认为identity,因此如果需要,可以将其简化为const cleanedObject = pickBy(originalObject)【参考方案3】:

使用 JSON 实用程序

概述

给定一个像这样的对象:

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

要删除对象中的undefined 属性,我们可以使用嵌套的 JSON 方法进行字符串化和解析,如下所示:

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 将转换为字符串 Datetime 值也转换为字符串

测试

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

【讨论】:

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

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

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

【讨论】:

顺便说一句,我使用别名 _acc 以避免 eslint 错误 no-param-reassign 我开始使用 filter + forEach 并最终将其转换为 reduce 像这样。 +1 Object.keys(obj).reduce((acc, key) => obj[key] === undefined ? ...acc : ...acc, [key] : obj[key] , )【参考方案5】:

此解决方案还避免了hasOwnProperty(),因为Object.keys 返回给定对象自己的可枚举属性的数组。

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

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

【讨论】:

【参考方案6】:

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

function removeUndefinedProps(obj) 
    for (var prop in obj) 
        if (obj.hasOwnProperty(prop) && obj[prop] === undefined) 
            delete obj[prop];
        
    

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

【讨论】:

【参考方案7】:

这个很容易记住,但可能会很慢。使用 jQuery 将非空属性复制到空对象。除非您添加 true 作为第一个参数,否则没有深层复制。

myObj = $.extend(, myObj);

【讨论】:

【参考方案8】:

嗯.. 我想@Damian 要求remove undefined field (property) from an JS object。 然后,我会简单地做:

for (const i in myObj)  
   if (typeof myObj[i] === 'undefined')   
     delete myObj[i]; 

短而有效的解决方案,在(原版)JS 中! 例子 :

const myObj = 
  a: 1,
  b: undefined,
  c: null, 
  d: 'hello world'
;

for (const i in myObj)  
  if (typeof myObj[i] === 'undefined')   
    delete myObj[i]; 

console.log(myObj);

【讨论】:

【参考方案9】:

另一个 Javascript 解决方案

for(var i=0,keys = Object.keys(obj),len=keys.length;i<len;i++) 
  if(typeof obj[keys[i]] === 'undefined')
    delete obj[keys[i]];
  

不需要额外的hasOwnProperty 检查,因为Object.keys 不查找原型链并且只返回obj 的属性。

DEMO

【讨论】:

除了 Object.keys() 在创建整个键数组时有自己的开销,并且至少需要 IE 9。【参考方案10】:

也可以对对象使用 JQuery 过滤器

var newobj = $(obj).filter(function(key) 
    return $(this)[key]!== undefined;
  )[0];

演示here

【讨论】:

以上是关于Javascript - 从对象中删除未定义的字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose/MongoDB 结果字段在 Javascript 中显示为未定义

Mongoose/MongoDB 结果字段在 Javascript 中显示为未定义

JavaScript 中的“未定义 x 1”是啥?

从缓存中读取查询导致在对象未定义上找不到字段 <field>

如何从数组中删除重复值?当数组内的对象属性未定义时,我的代码失败

从 Javascript 对象中删除值