我有一个数组,如果该数组只包含null
值,我想要一个简单的非循环测试。空数组也算作只有空值。
我想另一种描述问题的方法是测试数组是否至少有一个非空值。
所以:
Good: [ null, null, null ]
Good: []
Bad: [ null, 3, null ]
答案 0 :(得分:21)
我能想到的最简单的方法很简单:
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
值得注意的是,检查数组中可能存在,
特征的问题。
答案 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;
}