如何在NodeJS中检查JSON是否为空?

时间:2012-07-14 03:28:18

标签: javascript json node.js v8

我有一个函数可以检查请求是否有任何查询,并根据该函数执行不同的操作。目前,我有if(query)做其他事情。但是,似乎当没有查询数据时,我最终得到一个{} JSON对象。因此,我需要将if(query)替换为if(query.isEmpty())或类似的东西。任何人都可以解释我如何在NodeJS中做到这一点? V8 JSON对象是否具有此类功能?

6 个答案:

答案 0 :(得分:76)

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

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

答案 1 :(得分:28)

您可以使用:

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

或者这个:

function isEmpty(obj) {
  return !Object.keys(obj).length > 0;
}

您也可以使用:

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

  return true;
}

如果使用underscorejQuery,您可以使用isEmptyisEmptyObject来电。

答案 2 :(得分:5)

Object.keys(myObj).length === 0;

由于只需要检查Object是否为空,最好直接调用本机方法Object.keys(myObj).length,该方法通过内部循环for..in循环返回键数组。 {1}}根据对象中存在的属性返回布尔结果,该对象本身使用for..in循环进行迭代,时间复杂度为O(N2)。

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

答案 3 :(得分:2)

如果您与Object.keys兼容,并且节点确实具有兼容性,那么您应该使用它。

但是,如果你没有兼容性,并且出于任何原因使用循环功能是不可能的 - 像我一样,我使用了以下解决方案:

JSON.stringify(obj) === '{}'

考虑这个解决方案的最后手段'仅在必须时使用。

参见评论"有很多方法可以解决这个问题并不理想"。

我有一种不得已的方案,它完美无缺。

答案 4 :(得分:1)

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;

答案 5 :(得分:0)

我的解决方案:

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