【问题标题】:How to match an empty dictionary in Javascript?如何在Javascript中匹配一个空字典?
【发布时间】:2011-08-29 16:16:57
【问题描述】:

从节点 REPL 事物,

> d = {}
{}
> d === {}
false
> d == {}
false

鉴于我有一个空字典,我如何确定它是一个空字典?

【问题讨论】:

标签: javascript dictionary match


【解决方案1】:
function isEmpty(obj) {
  return Object.keys(obj).length === 0;
}

【讨论】:

  • 仅在较新的浏览器中。作为记录,keys 属性仅在 IE >= 9 reference 中受支持
  • 如果我现在还不习惯 JavaScript 缺少这个基本功能,我会感到惊讶。
  • 这是一个更新的答案:stackoverflow.com/questions/679915/…
【解决方案2】:

您可以使用isEmpty 方法扩展Object.prototype 以检查对象是否没有自己的属性:

Object.prototype.isEmpty = function() {
    for (var prop in this) if (this.hasOwnProperty(prop)) return false;
    return true;
};

【讨论】:

  • 哇 ..我觉得 javascript 缺少这种“基本”功能很有趣
  • 扩展 Object.prototype 可能会在以后迭代对象时产生问题yuiblog.com/blog/2006/09/26/for-in-intrigue
  • 这会干扰 jquery
  • 在react js中测试,但是输出Object.prototype.isEmpty: this= undefined,所以不行,怎么解决?
【解决方案3】:

使用 jQuery 怎么样?

$.isEmptyObject(d)

【讨论】:

    【解决方案4】:

    因为它没有属性,for 循环不会有任何东西可以迭代。为了给予应有的荣誉,我发现了这个建议here

    function isEmpty(ob){
       for(var i in ob){ return false;}
      return true;
    }
    
    isEmpty({a:1}) // false
    isEmpty({}) // true
    

    【讨论】:

    • 我会创建一个 count(obj) 函数,如果 count 等于 0,isEmpty 会进行评估。
    • 您可能需要在返回 false 之前检查 obj.hasOwnProperty(i)。这会过滤掉通过原型链继承的属性。
    【解决方案5】:

    这是jQuery 使用的,工作得很好。虽然这确实需要 jQuery 脚本使用 isEmptyObject

    isEmptyObject: function( obj ) {
        for ( var name in obj ) {
            return false;
        }
        return true;
    }
    
    //Example
    var temp = {};
    $.isEmptyObject(temp); // returns True
    temp ['a'] = 'some data';
    $.isEmptyObject(temp); // returns False
    

    如果不包括 jQuery,只需创建一个单独的纯 javascript 函数。

    function isEmptyObject( obj ) {
        for ( var name in obj ) {
            return false;
        }
        return true;
    }
    
    //Example
    var temp = {};
    isEmptyObject(temp); // returns True
    temp ['b'] = 'some data';
    isEmptyObject(temp); // returns False
    

    【讨论】:

      【解决方案6】:

      我远非 JavaScript 学者,但以下方法有用吗?

      if (Object.getOwnPropertyNames(d).length == 0) {
         // object is empty
      }
      

      它的优点是是单行纯函数调用。

      【讨论】:

      • 很酷的解决方案!它实际上是唯一一个没有循环且不调用第三方库的方法
      【解决方案7】:

      您必须像这样检查它是否属于“对象”类型:

      (typeof(d) === 'object')

      然后实现一个简短的“大小”函数来检查它是否为空,as mentioned here

      【讨论】:

        【解决方案8】:
        var SomeDictionary = {};
        if(jQuery.isEmptyObject(SomeDictionary))
        // Write some code for dictionary is empty condition
        else
        // Write some code for dictionary not empty condition
        

        这很好用。

        【讨论】:

          【解决方案9】:

          如果不考虑性能,这是一个容易记住的简单方法:

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

          不过,显然您不想在循环中对大对象进行字符串化。

          【讨论】:

            【解决方案10】:

            如果您在 Node.js 上尝试此操作,请使用此 sn-p,基于此代码 here

            Object.defineProperty(Object.prototype, "isEmpty", {
                enumerable: false,
                value: function() {
                        for (var prop in this) if (this.hasOwnProperty(prop)) return false;
                        return true;
                    }
                }
            );
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-19
              相关资源
              最近更新 更多