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

这个问题已经在这里有了答案:

  • 从Javascript对象中删除空白属性                                     31个答案

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

> 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]) }))
Damian asked 2019-12-29T19:59:31Z
10个解决方案
95 votes

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

jsbin

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

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

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

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;
};

jsbin

Rotareti answered 2019-12-29T20:00:11Z
47 votes

{a: 1, c: 3}

要移除对象中的{a: 1, c: 3}道具,我们将像这样使用

{a: 1, c: 3}

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

nmanikiran answered 2019-12-29T20:00:44Z
39 votes

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

import { pickBy, identity } from 'lodash'

const cleanedObject = pickBy(originalObject, identity)

请注意,标识函数只是undefined,其结果对于所有虚假值均为假。 因此,这会删除未定义的“”,“ 0”,null,...

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

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

它为您提供了一个新对象,通常比其他对象建议的突变方法要好。

Thijs Koerselman answered 2019-12-29T20:01:17Z
12 votes

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

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

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

Alvaro Pinot answered 2019-12-29T20:01:42Z
11 votes

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

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}

ptim answered 2019-12-29T20:02:06Z
3 votes

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

myObj = $.extend({}, myObj);
Fredrik answered 2019-12-29T20:02:26Z
2 votes

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

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

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

jfriend00 answered 2019-12-29T20:02:51Z
1 votes

嗯..我想@Damian要求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);。然后,我会简单地做:

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

Dam Fa answered 2019-12-29T20:03:19Z
0 votes

另一个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]];
  }
}

不需要进行额外的2679524646894175175检查,因为Object.keys不会查找原型链,仅返回obj的属性。

演示

Prabhu Murthy answered 2019-12-29T20:03:48Z
-1 votes

也可以将JQuery过滤器用于对象

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

在这里演示

user2314737 answered 2019-12-29T20:04:12Z
translate from https://stackoverflow.com:/questions/25421233/javascript-removing-undefined-fields-from-an-object