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

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

也就是说。

> 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]) }))
204635 次浏览

下面是一个普通的 javascript (不需要库)解决方案:

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

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

另一个 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的属性。

演示

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

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

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

这个很容易记,但可能很慢。使用 jQuery 将非空属性复制到空对象。除非添加 true作为第一个参数,否则不能进行深拷贝。

myObj = $.extend({}, myObj);

使用 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) ,否则我不会依赖此方法客户端。

我更喜欢用 Lodash 这样的词:

import { pickBy, identity } from 'lodash'


const cleanedObject = pickBy(originalObject, identity)

注意,标识函数只是 x => x,其结果对于 所有虚假的价值观将为 false。所以这会移除未定义的,“”,0,null,..。

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

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

它给你一个新的对象,这通常比像其他一些答案建议的那样改变原来的对象更好。

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

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

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}

嗯... 我想@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);