【问题标题】:Check for an empty map检查空地图
【发布时间】:2012-08-16 22:56:36
【问题描述】:

我遇到了一个有趣的问题,我确信它很容易解释,但我无法解释。

javascript 中的未定义或空对象等于 false。

var x;
alert(!x); //returns true
alert(x==true); //returns false

空数组对象呢?这相当于真还是假?

var x = [];
alert (x==true); //returns false
alert (!x); //returns false

如果等于true,如何判断是否为非空?我希望这样做

if (!x) {
    //do stuff
}

我尝试检查x.length,但我将此对象用作地图:

var x = [];
alert(x.length); //returns 0
x.prop = "hello"; 
alert(x.length); //still returns 0

如何检查我的地图是否为空?

【问题讨论】:

标签: javascript


【解决方案1】:

这并不像看起来那么容易,您必须检查对象是否至少具有一个属性。

jQuery 为此提供了isEmptyObject

function isEmptyObject( obj ) {
    for ( var name in obj ) {
        return false;
    }
    return true;
}

示例用法:

> var x = [];
> x.prop = "hello"; 
> isEmptyObject(x);
false

【讨论】:

  • @chama:你可以只包含那个函数,很简单。
【解决方案2】:

有点困惑,因为您似乎在问题中混合了对象和数组。希望这可能有助于为您解决问题。

一个空数组的计算结果为真:

!![] //true

但是整数 0 的计算结果为 false,所以你可以这样做:

!![].length //false

所以:

if([].length) {
   //array has 1 element at least
} else {
  //array has 0 elements
}

但是,您似乎确实混淆了数组和对象。在 JavaScript 中,我们有对象:

var x = {};
x.foo = "bar";
x.baz = 2;

我们有数组:

var x = [];
x.push("foo");
x.length //1

你不能做你在开瓶器中所做的事情:

var x = []; //x is an array
x.foo = "bar"; //can't do this on an array
x.length; // 0 

【讨论】:

  • 浏览器对此是否宽容?我在我的代码中都这样做了,没有任何抱怨......
  • 你可以做var x = [], x.foo = 2,你不会得到错误,但什么也不会发生。 x 仍然是一个空数组。
  • 但我仍然可以访问x.foo
  • 是的,你可以,但这不是你应该做的事情。要么将数组用作数组,要么将对象用作对象,并接受每种方法的优缺点。不要这样混搭!澄清一下:jsfiddle.net/yG5cf
【解决方案3】:

如果你使用的是 JQuery

jQuery.isEmptyObject(obj)

如果没有,你可以自己实现

isEmptyObject = function(obj) {
for (key in obj) {
    if (obj.hasOwnProperty(key)) return false;
}
return true;
};

【讨论】:

  • 应该是 if (obj.hasOwnProperty(key)) return false;否则返回 true
【解决方案4】:

如果您使用的是正确的 JS Map<K, V> 对象,您可以简单地使用 Mozilla Docs 上的 Map API。

特别是有一个Map.prototype.size 属性,以及Map.prototype.entries() 方法,我相信它返回一个数组[] 的键。如果那是length 0,那么地图是空的。

【讨论】:

    【解决方案5】:

    首先,您使用的是数组而不是地图。地图将是一个对象实例:

    var x = {};
    x.prop = "5";
    

    您的代码是有效的,因为数组也是对象。您可以按照this question 的回答检查您的对象是否为空。

    【讨论】:

      【解决方案6】:

      *如果为空列表将给出 true (if (array1))。

      *x.prop 并没有真正向数组添加任何元素,它只是将值“hello”分配给数组的属性 x,但数组仍然是空的。所以你仍然应该使用.length 来检查数组是否为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多