13

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

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

所以:

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

3 回答 3

26

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

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

但当然在内部,引擎仍将遍历数组。显式迭代数组实际上可能更快。重要的是,一旦遇到不存在的元素(该方法会这样做),就跳出循环。null

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

于 2013-10-12T18:41:51.820 回答
22

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

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 的回答 快一些

于 2013-10-12T18:40:35.000 回答
5
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原理。保持简单。_ _ _

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

于 2013-10-12T18:58:46.907 回答