在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
当前回答
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
})
这将递归地过滤掉所有无效字段。
其他回答
另一种选择是使用is.js(14kB),而不是jquery(32kB)、lodash(50kB)或下划线(16.4kB)。is.js被证明是上述库中最快的库,可以用来确定对象是否为空。
http://jsperf.com/check-empty-object-using-libraries
显然,所有这些库都不完全相同,因此如果您需要轻松地操作DOM,那么jquery可能仍然是一个不错的选择,或者如果您需要的不仅仅是类型检查,那么lodash或下划线可能是不错的选择。对于is.js,语法如下:
var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false
与下划线和lodash的_.isObject()一样,这不仅适用于对象,也适用于数组和字符串。
该库使用的是Object.getOwnPropertyNames,它类似于Object.keys,但Object.getownPropertyName更彻底,因为它将返回此处描述的可枚举和非可枚举财产。
is.empty = function(value) {
if(is.object(value)){
var num = Object.getOwnPropertyNames(value).length;
if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
return true;
}
return false;
} else {
return value === '';
}
};
如果您不想引入库(这是可以理解的),并且知道您只检查对象(而不是数组或字符串),那么下面的函数应该适合您的需要。
function isEmptyObject( obj ) {
return Object.getOwnPropertyNames(obj).length === 0;
}
这只比is.js快一点,只是因为你没有检查它是否是一个对象。
奇怪的是,我没有遇到一个解决方案来比较对象的值,而不是任何条目的存在(可能我在许多给定的解决方案中都没有找到它)。我想介绍一下如果一个对象的所有值都未定义,则该对象被视为空的情况:
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 }
// ...
}
您可以使用lodash库而不是创建一个简单的JS函数。
_.isEmpty({})//真
这将检查数组和对象是否有值并返回布尔值。
任何类型的值都为空
/* eslint-disable no-nested-ternary */
const isEmpty = value => {
switch (typeof value) {
case 'undefined':
return true;
case 'object':
return value === null
? true
: Array.isArray(value)
? !value.length
: Object.entries(value).length === 0 && value.constructor === Object;
case 'string':
return !value.length;
default:
return false;
}
};
老问题,但只是有问题。如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,就会得到答案:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}