在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:

var a = {};

我该如何检查是否是这种情况?


当前回答

这与在lodash源中检查对象的方式类似:

const isEmpty = value => {
  for (const key in value) {
    if (hasOwnProperty.call(value, key)) {
      return false
    }
  }
  return true;
}

但有很多其他方法可以做到这一点。

其他回答

正确答案是:

function isEmptyObject(obj) {
  return (
    Object.getPrototypeOf(obj) === Object.prototype &&
    Object.getOwnPropertyNames(obj).length === 0 &&
    Object.getOwnPropertySymbols(obj).length === 0
  );
}

这将检查:

对象的原型完全是object.prototype。该对象没有自己的财产(无论可枚举性如何)。对象没有自己的属性符号。

换句话说,该对象与使用{}创建的对象无法区分。

除了Thevs的回答:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

它是jquery+jquery.json

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

这将递归地过滤掉所有无效字段。

只是一个变通办法。如果没有数据,服务器是否可以生成一些特殊属性?例如:var a={empty:true};然后,您可以在AJAX回调代码中轻松检查它。另一种检查方法:如果(a.toSource()==“({})”)//则“a”为空

编辑:如果您使用任何JSON库(例如JSON.js),那么可以尝试JSON.encode()函数,并根据空值字符串测试结果。

1.使用Object.keys

Object.keys将返回一个数组,其中包含对象的属性名。如果数组的长度为0,那么我们知道对象是空的。

function isEmpty(obj) {
    return Object.keys(obj).length === 0 && obj.constructor === Object;
}

我们还可以使用Object.values和Object.entries检查这一点。这通常是确定对象是否为空的最简单方法。

2.使用for…in循环对象财产

for…in语句将循环通过对象的可枚举属性。

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

在上面的代码中,我们将循环遍历对象财产,如果一个对象至少有一个属性,那么它将进入循环并返回false。如果对象没有任何财产,那么它将返回true。

#3.使用JSON.stringify如果我们将对象字符串化,结果只是一个左括号和右括号,那么我们就知道对象是空的。

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

4.使用jQuery

jQuery.isEmptyObject(obj); 

5.使用Undercore和Lodash

_.isEmpty(obj);

资源