检测数组中是否只有空值

时间:2013-10-12 18:35:40

标签: javascript

我有一个数组,如果该数组只包含null值,我想要一个简单的非循环测试。空数组也算作只有空值。

我想另一种描述问题的方法是测试数组是否至少有一个非空值。

所以:

Good: [ null, null, null ]
Good: []
Bad:  [ null, 3, null ]

3 个答案:

答案 0 :(得分:21)

我能想到的最简单的方法很简单:

Array.prototype.isNull = function (){
    return this.join().replace(/,/g,'').length === 0;
};

[null, null, null].isNull(); // true
[null, 3, null].isNull(); // false

JS Fiddle demo

这将获取数组,将该数组的元素连接在一起(不带参数join()将数组元素与,个字符连接在一起)返回一个字符串,替换所有,个字符在该字符串(使用正则表达式)中使用空字符串,然后测试长度是否等于0。所以:

[null, 3, null].isNull()

联合起来给予:

',3,'

是否替换了所有逗号(使用正则表达式后面的g标志),给出:

'3'

测试其长度是否等于0,给出:

false

值得注意的是,检查数组中可能存在,特征的问题。

此外,Felix Kling's answer somewhat faster

答案 1 :(得分:19)

您可以使用Array#every

来避免使用显式循环
var all_null = arr.every(function(v) { return v === null; });

但当然内部引擎仍会迭代阵列。明确地迭代数组可能实际上更快。一旦遇到不是null的元素(该方法就是这样),重要的是 break 离开循环。

每个浏览器都不支持此方法,请参阅polyfill的链接。

答案 2 :(得分:4)

var arrayData1 = [null, null, null];
var arrayData2 = [];
var arrayData3 = [null, 3, null];
var arrayData4 = [3];

function isNull(inputArray) {
    if (inputArray.length) {
        var currentElement = inputArray[0];
        for (var i = 1, len = inputArray.length; i < len && currentElement === null; i += 1) {
            currentElement = currentElement || inputArray[i];
        }
        if (currentElement !== null) {
            return false;
        }
    }
    return true;
}

console.log(isNull(arrayData1));
console.log(isNull(arrayData2));
console.log(isNull(arrayData3));
console.log(isNull(arrayData4));

<强>输出

true
true
false
false

编辑1:这是最有效的解决方案(由user2736012建议)。此解决方案适用 KISS 原则。 K eep t S 实施, S illy。

function isNull(inputArray) {
  for (var i = 0, len = inputArray.length; i < len; i += 1)
    if (inputArray[i] !== null)
      return false;
  return true;
}

效果结果:http://jsperf.com/so-q-19337761/6