在AJAX请求之后,有时我的应用程序可能返回一个空对象,例如:
var a = {};
如何检查情况呢?
#1楼
如果您使用的是较新的浏览器,则有一种简单的方法。 Object.keys(obj).length == 0
#2楼
我正在用这个。
function isObjectEmpty(object)
{
var isEmpty = true;
for(keys in object)
{
isEmpty = false;
break; // exiting since we found that the object is not empty
}
return isEmpty;
}
例如:
var myObject = {}; // Object is empty
var isEmpty = isObjectEmpty(myObject); // will return true;
// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"};
// check if the object is empty
isEmpty = isObjectEmpty(myObject); // will return false;
更新资料
要么
您可以使用isEmptyObject的jQuery实现
function isEmptyObject ( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
#3楼
Sugar.JS为此提供了扩展对象。 代码简洁明了:
制作一个扩展对象:
a = Object.extended({})
检查它的大小:
a.size()
#4楼
如何使用JSON.stringify? 它几乎在所有现代浏览器中都可用。
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
#5楼
旧的问题,但是有问题。 如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。 相反,深入JQuery的代码 ,您将得到答案:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
#6楼
您可以使用不使用jQuery或其他库的简单代码
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
JSON类及其功能( parse和stringify )非常有用,但是IE7存在一些问题,您可以使用此简单代码http://www.json.org/js.html对其进行修复。
其他简单方式(最简单的方式):
您可以使用这种方式,而无需使用jQuery或JSON对象。
var a=({});
function isEmptyObject(obj) {
if(typeof obj!='object') {
//it is not object, so is not empty
return false;
} else {
var x,i=0;
for(x in obj) {
i++;
}
if(i>0) {
//this object has some properties or methods
return false;
} else {
//this object has not any property or method
return true;
}
}
}
alert(isEmptyObject(a)); //true is alerted
#7楼
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
参见http://bencollier.net/2011/04/javascript-is-an-object-empty/
#8楼
如果jQuery和Web浏览器不可用,则underscore.js中还有一个isEmpty函数。
_.isEmpty({}) // returns true
此外,它不假定输入参数为对象。 对于列表或字符串或未定义的列表,它也会提供正确的答案。
#9楼
除了Thevs答案:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
这是jquery + jquery.json
#10楼
在幕后,所有库中的所有空检查方法都使用对象键检查逻辑。 使它易于理解是一种奇怪的方式,您可以将其放入方法中, 在此进行描述。
for(key in obj){
//your work here.
break;
}
它在ES5中得到了发展,现在可以简单地使用Object.Keys
方法检查对象的键长, Object.Keys
方法将对象作为参数:
if(Object.keys(obj).length > 0){
//do your work here
}
或者,如果您正在使用Lodash (必须),则使用。
_.isEmpty(obj) //==true or false
#11楼
我创建了一个完整的函数来确定对象是否为空。
如果可能,它将使用ECMAScript 5 (ES5)功能的Object.keys
以获得最佳性能(请参阅兼容性表 ),并回退到旧引擎(浏览器)的最兼容方法。
解
/**
* Returns true if specified object has no properties,
* false otherwise.
*
* @param {object} object
* @returns {boolean}
*/
function isObjectEmpty(object)
{
if ('object' !== typeof object) {
throw new Error('Object must be specified.');
}
if (null === object) {
return true;
}
if ('undefined' !== Object.keys) {
// Using ECMAScript 5 feature.
return (0 === Object.keys(object).length);
} else {
// Using legacy compatibility mode.
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
}
这是此代码的要点 。
这是带有演示和简单测试的JSFiddle 。
希望对您有所帮助。 干杯!
#12楼
这是我的首选解决方案:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
#13楼
我只是遇到了类似情况。 我不想使用JQuery,而是想使用纯Javascript做到这一点。
我所做的就是使用以下条件,它对我有用。
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
对于不等于,请使用以下命令: JSON.stringify(obj) !== '{}'
看看这个JSFiddle
#14楼
对于那些同样的问题但使用jQuery的人,可以使用jQuery.isEmptyObject 。
#15楼
另一种选择是使用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()
,这不仅适用于objects
而且适用于arrays
和strings
。
引擎盖下这个库是用Object.getOwnPropertyNames
它类似于Object.keys
但Object.getOwnPropertyNames
是更彻底的,因为所描述的,将返回可枚举和不可枚举的属性在这里 。
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快一点,尽管只是因为您没有检查它是否是对象。
#16楼
ECMA 7+ :
// because Object.entries(new Date()).length === 0;
// we have to do some additional check
Object.entries(obj).length === 0 && obj.constructor === Object
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
ECMA 5之前的版本:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery的 :
jQuery.isEmptyObject({}); // true
lodash :
_.isEmpty({}); // true
下划线 :
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
#17楼
对于空对象,使用Object.keys(obj).length(如上文ECMA 5+所建议)的速度要慢10倍! 保持老派的选择。
经过Node,Chrome,Firefox和IE 9的测试,很明显对于大多数用例:
- (for ... in ...)是最快的选择!
- 空对象的Object.keys(obj).length慢10倍
- JSON.stringify(obj).length总是最慢的 (不令人惊讶 )
- 在某些系统上, Object.getOwnPropertyNames(obj).length花费的时间比Object.keys(obj).length可以更长。
底线性能明智,请使用:
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
要么
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
有关详细的测试结果和测试代码,请参见对象是否为空?
#18楼
我发现的最好方法:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
效劳于:
t1: {} -> true
t2: {0:1} -: false
t3: [] -> true
t4: [2] -> false
t5: null -> true
t6: undefined -> true
t7: "" -> true
t8: "a" -> false
t9: 0 -> true
t10: 1 -> false
#19楼
下面的示例演示如何测试JavaScript对象是否为空,如果为空,则意味着我们没有自己的属性。
该脚本可在ES6上运行。
const isEmpty = (obj) => { if (obj === null || obj === undefined || Array.isArray(obj) || typeof obj !== 'object' ) { return true; } return Object.getOwnPropertyNames(obj).length === 0; }; console.clear(); console.log('-----'); console.log(isEmpty('')); // true console.log(isEmpty(33)); // true console.log(isEmpty([])); // true console.log(isEmpty({})); // true console.log(isEmpty({ length: 0, custom_property: [] })); // false console.log('-----'); console.log(isEmpty('Hello')); // true console.log(isEmpty([1, 2, 3])); // true console.log(isEmpty({ test: 1 })); // false console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false console.log('-----'); console.log(isEmpty(new Date())); // true console.log(isEmpty(Infinity)); // true console.log(isEmpty(null)); // true console.log(isEmpty(undefined)); // true
#20楼
您可以检查对象键的数量:
if (Object.keys(a).length > 0) {
// not empty
}
#21楼
jQuery在这种情况下具有特殊的功能isEmptyObject()
:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
进一步了解http://api.jquery.com/jQuery.isEmptyObject/
#22楼
正确答案是:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
这将检查:
- 该对象没有自己的属性(无论可枚举性如何)。
- 该对象没有自己的属性符号。
- 对象的原型正是
Object.prototype
。
换句话说,该对象与用{}
创建的对象是无法区分的。
#23楼
我会去检查它是否至少有一把钥匙。 这就足以告诉我它不是空的。
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
#24楼
根据Object.entries()上的ES2017规范,使用任何现代浏览器均可轻松进行检查-
Object.entries({}).length === 0
#25楼
您可以使用Underscore.js 。
_.isEmpty({}); // true
#26楼
警告! 当心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 {}
#27楼
没有简单的方法可以做到这一点。 您必须显式地遍历属性:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
如果有ECMAScript 5支持,则可以改用Object.keys()
:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
#28楼
只是一种解决方法。 如果没有数据,您的服务器能否生成一些特殊属性?
例如:
var a = {empty:true};
然后,您可以轻松地在AJAX回调代码中对其进行检查。
另一种检查方法:
if (a.toSource() === "({})") // then 'a' is empty
编辑 :如果您使用任何JSON库(fe JSON.js),则可以尝试JSON.encode()函数并针对空值字符串测试结果。
#29楼
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
#30楼
我的看法:
function isEmpty(obj) {
return !Object.keys(obj).length > 0;
}
var a = {a:1, b:2}
var b = {}
console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true
只是,我不认为目前所有的浏览器都实现Object.keys()
。