【问题标题】:How can I check if a JSON is empty in NodeJS?如何检查 NodeJS 中的 JSON 是否为空?
【发布时间】:2012-07-13 21:52:10
【问题描述】:

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

【问题讨论】:

  • if(0 < query.length) { ... } 不行吗?
  • naaa,query.length == 未定义。长度是数组对象的标准,而不是 JSON 对象。

标签: javascript json node.js v8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以用这个:

    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 调用。

    【讨论】:

      【解决方案3】:
      Object.keys(myObj).length === 0;
      

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

      另一方面,调用本身具有以上两个实现或其他实现的 UDF 将适用于小对象,但如果对象大小很大,则会阻塞代码,这将对整体性能产生严重影响,除非事件中没有其他等待循环。

      【讨论】:

        【解决方案4】:

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

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

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

        将此解决方案视为仅在必须时才使用的“最后手段”。

        在 cmets 中查看“此解决方案在很多方面并不理想”。

        我有一个不得已的方案,而且效果很好。

        【讨论】:

        • 这不是一个很好的解决方案有很多原因,包括性能,以及对象可以被字符串化的各种方式,例如,用属性字符串化 Error
        • @DaveNewton, ,我同意这不是一个很好的解决方案。我在回答中说明了这一点。我不同意错误示例,因为Object.keys(obj).length === 0 也会返回空,所以在这种情况下,这个解决方案仍然是正确的。
        【解决方案5】:

        我的解决方案:

        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
        

        【讨论】:

          【解决方案6】:
          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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-26
            • 2023-03-15
            • 2021-04-10
            • 2021-08-12
            相关资源
            最近更新 更多