Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测数组中是否只有空值_Javascript - Fatal编程技术网

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;
}