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

var a = {};

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


当前回答

您可以使用Undercore.js。

_.isEmpty({}); // true

其他回答

老问题,但只是有问题。如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,就会得到答案:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

我知道这并不能100%回答你的问题,但我以前也遇到过类似的问题,下面是我如何解决这些问题:

我有一个可能返回空对象的API。因为我知道从API中需要哪些字段,所以我只检查是否存在任何必需的字段。

例如:

API返回{}或{agentID:“1234”(必需),地址:“1234通道”(可选),…}。在我的调用函数中,我只检查

if(response.data && response.data.agentID) { 
  do something with my agentID 
} else { 
  is empty response
}

这样,我就不需要使用那些昂贵的方法来检查对象是否为空。如果对象没有agentID字段,则调用函数的对象将为空。

尝试解构

const a = {};
const { b } = a;
const emptryOrNot = (b) ? 'not Empty' : 'empty';
console.log(emptryOrNot)
    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
            })

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

奇怪的是,我没有遇到一个解决方案来比较对象的值,而不是任何条目的存在(可能我在许多给定的解决方案中都没有找到它)。我想介绍一下如果一个对象的所有值都未定义,则该对象被视为空的情况:

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 }
  // ...
}