null
我有一个数组,如果该数组仅包含值,我想要一个简单的非循环测试。空数组也算作只有空值。
我想另一种描述问题的方法是测试数组是否至少有一个非空值。
所以:
Good: [ null, null, null ]
Good: []
Bad: [ null, 3, null ]
null
我有一个数组,如果该数组仅包含值,我想要一个简单的非循环测试。空数组也算作只有空值。
我想另一种描述问题的方法是测试数组是否至少有一个非空值。
所以:
Good: [ null, null, null ]
Good: []
Bad: [ null, 3, null ]
您可以通过使用避免使用显式循环Array#every
:
var all_null = arr.every(function(v) { return v === null; });
但当然在内部,引擎仍将遍历数组。显式迭代数组实际上可能更快。重要的是,一旦遇到不存在的元素(该方法会这样做),就跳出循环。null
并非每个浏览器都支持此方法,请参阅 polyfill 的链接。
我能想到的最简单的方法很简单:
Array.prototype.isNull = function (){
return this.join().replace(/,/g,'').length === 0;
};
[null, null, null].isNull(); // true
[null, 3, null].isNull(); // false
这需要数组,将该数组的元素连接在一起(不带参数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原理。保持简单,傻。_ _ _
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