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

61

我有一个函数,用于检查请求是否有任何查询,并根据情况执行不同的操作。目前,我的代码是这样的:if(query) 做这个,否则做那个。然而,当没有查询数据时,我得到了一个 {} JSON 对象。因此,我需要将 if(query) 替换为 if(query.isEmpty()) 或类似的东西。有人可以解释一下我如何在 NodeJS 中实现吗?V8 JSON 对象有类似的功能吗?


if(0 < query.length) { ... } 不行吗? - MilkyWayJoe
1
naaa,query.length == undefined。length是Array对象的标准属性,而不是JSON对象的属性。 - thisissami
6个回答

119

您可以使用以下任何一个函数:

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

38
你可以使用这个:
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调用。

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

由于只需要检查对象是否为空,因此最好直接调用本机方法 Object.keys(myObj).length,该方法通过内部迭代使用 for...in 循环返回键数组。由于 Object.hasOwnProperty 基于对象中存在的属性返回布尔结果,它本身会使用 for...in 循环进行迭代且时间复杂度为 O(N2),所以直接调用本机方法效率更高。

另一方面,对于小对象,调用具有上述两种实现或其他实现的 UDF 可行,但如果对象的大小较大,除非事件循环中没有其他等待时间,否则将阻塞代码,对整体性能产生严重影响。


2

我的解决方案:

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

2

如果你的代码支持 Object.keys,并且node也支持,那么你应该毫不犹豫地使用它。

然而,如果你的代码不支持,或者由于某些原因不能使用循环函数 - 就像我一样,可以使用以下解决方案:

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

如果必须使用,请将此解决方案视为“最后的手段”。

请参阅评论中的“这种解决方案不理想的方式很多”。

我遇到了一种最后的情况,它完美地解决了问题。


2
这并不是一个很好的解决方案,原因有很多,包括性能和对象字符串化的方式的多样性,例如,使用属性对“Error”进行字符串化。 - Dave Newton
1
@DaveNewton,我同意这不是一个好的解决方案。我在我的答案中已经表明了这一点。关于Error示例,我并不同意,因为Object.keys(obj).length === 0也会返回空值,所以在这种情况下,这个解决方案仍然是正确的。 - guy mograbi

2
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接