在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
当前回答
如果您使用更新的浏览器,有一个简单的方法。对象.keys(obj).length==0
其他回答
奇怪的是,我没有遇到一个解决方案来比较对象的值,而不是任何条目的存在(可能我在许多给定的解决方案中都没有找到它)。我想介绍一下如果一个对象的所有值都未定义,则该对象被视为空的情况:
const isObjectEmpty=obj=>Object.values(obj).every(val=>typeof val==“undefined”)console.log(isObjectEmpty({}))//trueconsole.log(isObjectEmpty({foo:undefined,bar:undefine}))//trueconsole.log(isObjectEmpty({foo:false,bar:null}))//false
示例用法
举个例子,我们有一个函数(paintOnCanvas),它从参数(x,y和size)中销毁值。如果所有这些选项都未定义,则它们将被排除在生成的选项集之外。如果不是,它们都包括在内。
function paintOnCanvas ({ brush, x, y, size }) {
const baseOptions = { brush }
const areaOptions = { x, y, size }
const options = isObjectEmpty(areaOptions) ? baseOptions : { ...baseOptions, areaOptions }
// ...
}
我很喜欢我想出的这个,在这里的一些其他答案的帮助下。我想我会分享。
Object.defineProperty(Object.prototype,'isEmpty'{获取(){for(此处为var p){if(this.hasOwnProperty(p)){return false}}返回true;}});让用户={};让颜色={primary:“红色”};让大小={sm:100,md:200,lg:300};控制台日志('\nusers=',用户,'\nusers.isEmpty==>'+users.isEmpty,“\n\n--------------\n”,'\ncolors=',颜色,'\ncolors.isEmpty==>'+colors.isEmpty,“\n\n--------------\n”,'\nsizes=',大小,'\nsizes.isEmpty==>'+sizes.isEmpty,“\n”,'');
let jsObject = JSON.parse(JSON.stringify(obj), (key, value) => {
if (value === null ||
value === '' ||
(value.constructor === Object && Object.entries(value).length === 0) ||
(value.constructor === Array && value.length === 0)) {
return undefined
}
return value
})
这将递归地过滤掉所有无效字段。
警告当心JSON的限制。
javascript:
obj={ f:function(){} };
alert( "Beware!! obj is NOT empty!\n\nobj = { f:function(){} }" +
"\n\nJSON.stringify( obj )\n\nreturns\n\n" +
JSON.stringify( obj ) );
显示器
Beware!! obj is NOT empty! obj = { f:function(){} } JSON.stringify( obj ) returns {}
这一行代码也有助于回退到较旧的浏览器。
var a = {}; //if empty returns false
(Object.getOwnPropertyNames ? Object.getOwnPropertyNames(a).length !== 0 : (function(){ for(var key in a) break; return !!key })()) //Returns False
var a = {b:2}; //if not empty returns true
(Object.getOwnPropertyNames ? Object.getOwnPropertyNames(a).length !== 0 : (function(){ for(var key in a) break; return !!key })()) //Returns true
Object.getOwnPropertyNames在ECMA-5中实现。上面的行在具有回退功能的旧浏览器中工作。
另一个快速解决方案是检查Object.keys、Object.entries或Object.values
知识文章:关注这篇SO文章,了解Object.keys与Object.getOwnPropertyNames之间的详细区别