首页 > 解决方案 > For循环不检查数组中的所有元素

问题描述

我想检查数组是否有相似的元素。
如果所有元素都相似,则返回 true,否则返回 false。

function isUniform(arr){
    var first = arr[0];
    for(var q=1; q < arr.length; q++){
        if(arr[q]!==first){
            return false;
        }
    }
    return true;
}

for 循环只检查数组中的前两个元素,其余的不被检查。

为什么会这样?

在此处输入图像描述
正如你所看到的,前两个数组应该有错误的输出,但前两个元素是相同的,所以它显示为真。这意味着它不检查其余元素。

标签: javascripthtmlcss

解决方案


我刚刚将您的代码粘贴到开发人员控制台中,它似乎可以正常工作。因为您return false在元素不相等时进行了编码,所以函数将停止。您可以改为设置一个变量并在函数末尾返回它。

简单的解决方案

  1. 将变量设置为 true,然后像以前一样进行检查。
  2. 如果满足条件,则将变量设置为 false。
  3. 返回最终结果
function isUniform(arr){
    var first = arr[0];
    var result = true;

    for(var q=1; q < arr.length; q++){
        if(arr[q] !== first){
            result = false;
        }
    }
    return result;
}

更高效的解决方案

简单解决方案的运行时间为O(n). 所以不一定很好。但我们可以改进它!通过添加一个简单break的方法,我们提高了算法的效率!一旦我们遇到一个不等于我们的第一个值的值,我们就会停止迭代并返回我们的结果。这是被称为短路的概念。它有点类似于您的原始函数,因为它不会检查数组中的所有值。但是,对于非常大的阵列,这将是首选方法。

function isUniform(arr){
    var first = arr[0];
    var result = true;

    for(var q=1; q < arr.length; q++){
        if(arr[q] !== first){
            result = false;
            break;
        }
    }
    return result;
}

利用集合

您还可以使用Set做一些很酷的事情。集合旨在保存唯一值。所以,如果我们创建一个集合并且它的大小是 1,我们知道我们所有的值都是相同的。如果大小大于 1,则Set.size我们的数组中至少有多个唯一值。

在下面的函数中,我们从数组中创建一个新的 Set。然后我们使用 Set 对象的 size 属性来检查我们的条件!干净简单。

function isUniform(arr) {
    return new Set(arr).size === 1;
}

注意:对于非常大的数组,这不是有效的;它的运行时间为O(n)


推荐阅读