如何在Javascript中匹配一个空字典?

96

从 Node REPL 中,

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

假设我有一个空字典,如何确保它是一个空字典?


1
你可以考虑使用像check-types这样的库。在这种情况下,你可以使用check.emptyObject(d) - mareoraft
1
这里有一个更为实时的答案:https://dev59.com/OHRB5IYBdhLWcg3wQFPu - guettli
JSON.stringify({}).length -2 ? true : false - Post Malone
10个回答

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

1
仅适用于较新的浏览器。值得一提的是,keys属性仅在IE >= 9中受支持参考 - Nick Mitchell
11
如果我还没有习惯 JavaScript 缺少这种基本功能,我会感到惊讶。 - Teekin
这里有一个更为实时的答案:https://dev59.com/OHRB5IYBdhLWcg3wQFPu - guettli

19

你可以通过扩展Object.prototype来使用此isEmpty方法检查对象是否没有自有属性:

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

33
哇,我觉得挺有趣的,JavaScript 缺乏这种“基本”的功能。 - harijay
2
扩展Object.prototype可能会在以后迭代对象时出现问题。http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ - Camilo Sanchez
1
这会干扰 jQuery。 - Rubber Duck
在React.js中进行测试,但输出 Object.prototype.isEmpty: this= undefined,因此无法正常工作,如何修复此问题? - crifan

19

用jQuery如何?

$.isEmptyObject(d)

12

由于它没有属性,for循环将没有任何要迭代的内容。为了归功于建议者,我在这里找到了这个建议

function isEmpty(ob){
   for(var i in ob){ return false;}
  return true;
}

isEmpty({a:1}) // false
isEmpty({}) // true

1
我会创建一个count(obj)函数,而isEmpty将评估计数是否等于0。 - Matías Fidemraizer
5
在返回false之前,你可能需要检查obj.hasOwnProperty(i)。这将过滤掉通过原型链继承的属性。 - Elian Ebbing

10

这就是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

9
我并不是JavaScript专家,但以下内容是否可行?

我远非JavaScript学者,但以下内容是否可行?

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

它的优点在于可以使用一行纯函数调用实现。

很酷的解决方案!它实际上是唯一一个没有循环和调用第三方库的方案。 - Antonio Ragagnin

3

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

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

显然,您不希望在循环中对大型对象进行字符串化。


2
var SomeDictionary = {};
if(jQuery.isEmptyObject(SomeDictionary))
// Write some code for dictionary is empty condition
else
// Write some code for dictionary not empty condition

这个工作正常运行。


1

您需要检查它是否为“object”类型,如下所示:

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

然后实现一个简短的“size”函数来检查它是否为空,如此提到


0

如果您想在Node.js上尝试这个,请使用此片段,基于此代码 在这里

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

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