Javascript 检测数组中是否只有空值
我有一个数组,如果该数组只包含Javascript 检测数组中是否只有空值,javascript,Javascript,我有一个数组,如果该数组只包含null值,我想要一个简单的非循环测试。空数组也算作只有空值 我想描述这个问题的另一种方法是测试数组是否至少有一个非空值 因此: 我能想到的最简单的方法是: Array.prototype.isNull = function (){ return this.join().replace(/,/g,'').length === 0; }; [null, null, null].isNull(); // true [null, 3, null].isNull(
null
值,我想要一个简单的非循环测试。空数组也算作只有空值
我想描述这个问题的另一种方法是测试数组是否至少有一个非空值
因此:
我能想到的最简单的方法是:
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'
false
测试其长度是否等于0
,得出:
'3'
false
值得注意的是,在选中的数组中可能存在,
特性的问题
另外,is.您可以通过以下方法避免使用显式循环:
当然,引擎在内部仍然会遍历数组。显式迭代数组实际上可能更快。重要的是,一旦遇到非null
的元素(方法就是这样做的),就要打破循环
并非每个浏览器都支持此方法,请参见多边形填充的链接
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));
编辑1:下面是最有效的解决方案(由用户2736012建议)。此解决方案适用于亲吻原则KeepItSimple,SILY
function isNull(inputArray) {
for (var i = 0, len = inputArray.length; i < len; i += 1)
if (inputArray[i] !== null)
return false;
return true;
}
函数为空(inputArray){
对于(变量i=0,len=inputArray.length;i
性能结果:为什么不简单地循环并测试所有值?非常大,而且调用非常频繁。将来可能会将其映射到mongodb。
!arr.some(函数(v){return v!==null;})代码>。。。当然,这在某种程度上是循环的。如果不循环,就无法比较数组中的值。@FelixKling ty,将其作为回答plsRelated:+1发布,或者使用下划线.js:var all\u null=!\。一些(arr)
@kol:改为每一个
(更容易理解,工作原理相同),但是是的+1为实现更安全和大约1500次操作/秒的速度,解决方案:我在jsperf页面添加了下划线版本:@David:有趣的是,在FF中,您的解决方案似乎更快:)比我快。只希望数组中没有逗号。。。修改内置类型的原型不是一种糟糕的做法吗?无意冒犯:)好吧,[“,”]
和类似的…@Pavlo:那名少年将在那天学到一课,提高他们的理解力和技能。当然,你不认为这是坏事,对吗?帕夫洛:什么被普遍认为是不良行为?扩展Array.prototype
?如果是这样,那就是胡说八道。在设计一个公开使用的代码库时,这可能是一种不好的做法(至少没有明确的事实文档),但除此之外,它既不好也不坏。这只是解决问题的一种方法。你的for
循环很奇怪,因此isNull()
为[3]
()返回true
。@FrédéricHamidi现在修复了它。请查收。:)@里查米迪神父,谢谢你。修改后,我的解决方案比其他解决方案快一点(至少在我的浏览器上是这样),复杂性远远超过需要。只需使用for
和if
语句即可简化。因此,最终,简单循环胜过正则表达式匹配和函数映射。简单循环万岁。
function isNull(inputArray) {
for (var i = 0, len = inputArray.length; i < len; i += 1)
if (inputArray[i] !== null)
return false;
return true;
}