Javascript 如何检查NodeJSON中的JSON是否为空?

Javascript 如何检查NodeJSON中的JSON是否为空?,javascript,json,node.js,v8,Javascript,Json,Node.js,V8,我有一个函数来检查一个请求是否有任何查询,并基于此执行不同的操作。目前,我有if(query)做其他事情。然而,似乎当没有查询数据时,我会得到一个{}JSON对象。因此,我需要将if(query)替换为if(query.isEmpty())或类似的内容。有人能解释一下我怎么能在NodeJS中这样做吗?V8 JSON对象是否具有此类功能?您可以使用以下任一功能: // This should work in node.js and other ES5 compliant implementatio

我有一个函数来检查一个请求是否有任何查询,并基于此执行不同的操作。目前,我有
if(query)
做其他事情。然而,似乎当没有查询数据时,我会得到一个
{}
JSON对象。因此,我需要将
if(query)
替换为
if(query.isEmpty())
或类似的内容。有人能解释一下我怎么能在NodeJS中这样做吗?V8 JSON对象是否具有此类功能?

您可以使用以下任一功能:

// This should work in node.js and other ES5 compliant implementations.
function isEmptyObject(obj) {
  return !Object.keys(obj).length;
}

// This should work both there and elsewhere.
function isEmptyObject(obj) {
  for (var key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      return false;
    }
  }
  return true;
}
用法示例:

if (isEmptyObject(query)) {
  // There are no queries.
} else {
  // There is at least one query,
  // or at least the query object is not empty.
}
您可以使用以下选项:

var isEmpty = function(obj) {
  return Object.keys(obj).length === 0;
}
function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
      return false;
  }

  return true;
}
或者这个:

function isEmpty(obj) {
  return !Object.keys(obj).length > 0;
}
您还可以使用以下选项:

var isEmpty = function(obj) {
  return Object.keys(obj).length === 0;
}
function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
      return false;
  }

  return true;
}

如果使用或,您可以使用它们的
isEmpty
isEmptyObject
调用。

如果您与
对象兼容。键
,并且节点确实具有兼容性,您应该确保使用它们

但是,如果您不具备兼容性,并且出于任何原因,使用循环函数是不可能的-就像我一样,我使用了以下解决方案:

JSON.stringify(obj)=='{}'
只有在必要时才将此解决方案视为“最后手段”

请参见评论中的“此解决方案在许多方面都不理想”

我有一个万不得已的方案,效果非常好

我的解决方案:

let isEmpty = (val) => {
    let typeOfVal = typeof val;
    switch(typeOfVal){
        case 'object':
            return (val.length == 0) || !Object.keys(val).length;
            break;
        case 'string':
            let str = val.trim();
            return str == '' || str == undefined;
            break;
        case 'number':
            return val == '';
            break;
        default:
            return val == '' || val == undefined;
    }
};
console.log(isEmpty([1,2,4,5])); // false
console.log(isEmpty({id: 1, name: "Trung",age: 29})); // false
console.log(isEmpty('TrunvNV')); // false
console.log(isEmpty(8)); // false
console.log(isEmpty('')); // true
console.log(isEmpty('   ')); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
因为只需要检查对象是否为空,所以最好直接调用本机方法Object.keys(myObj).length,它通过在循环中使用for..in进行内部迭代来返回键数组。As
Object.hasOwnProperty
返回一个基于对象中存在的属性的布尔结果,该对象本身使用for..in循环进行迭代,其时间复杂度为O(N2)


另一方面,调用本身具有以上两种实现或其他实现的UDF对于小对象来说可以很好地工作,但如果对象大小很大,则会阻塞代码,这将对总体性能产生严重影响,除非事件循环中没有其他东西在等待。

如果(0工作,则不会
naaa,query.length==未定义。长度是数组对象的标准长度,而不是JSON对象。这不是一个好的解决方案有很多原因,包括性能,以及对象字符串化的各种方式,例如,使用属性字符串化
错误。@DaveNewton,我同意这不是一个好的解决方案。我在答复中说明了这一点。我不同意这个错误示例,因为
Object.keys(obj).length==0
也会返回空,所以在这种情况下,这个解决方案仍然是正确的。
const isEmpty = (value) => (
    value === undefined ||
    value === null ||
    (typeof value === 'object' && Object.keys(value).length === 0) ||
    (typeof value === 'string' && value.trim().length === 0)
  )

module.exports = isEmpty;