检测数组中是否只有空值

Detect if array has only null values in it

本文关键字:空值 是否 数组 检测      更新时间:2023-09-26

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

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

所以:

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

您可以通过使用以下Array#every来避免使用显式循环:

var all_null = arr.every(function(v) { return v === null; });

但当然,在内部,引擎仍将迭代数组。 显式迭代数组实际上可能更快。重要的是要在遇到未null元素时中断循环(该方法就是这样做的)。

并非每个浏览器都支持此方法,请参阅多边形填充的链接。

我能想到的最简单的方法是一个简单的:

Array.prototype.isNull = function (){
    return this.join().replace(/,/g,'').length === 0;
};
[null, null, null].isNull(); // true
[null, 3, null].isNull(); // false

JS小提琴演示。

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

[null, 3, null].isNull()

联合起来给予:

',3,'

替换所有逗号(在正则表达式后使用 g 标志),以给出:

'3'

测试以查看其长度是否等于 0 ,得到:

false

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

此外,Felix Kling的回答更快一些。

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 I t S imple, 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