javascript - 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 循环只检查数组中的前两个元素,其余的不被检查。
为什么会这样?
正如你所看到的,前两个数组应该有错误的输出,但前两个元素是相同的,所以它显示为真。这意味着它不检查其余元素。
解决方案
我刚刚将您的代码粘贴到开发人员控制台中,它似乎可以正常工作。因为您return false
在元素不相等时进行了编码,所以函数将停止。您可以改为设置一个变量并在函数末尾返回它。
简单的解决方案
- 将变量设置为 true,然后像以前一样进行检查。
- 如果满足条件,则将变量设置为 false。
- 返回最终结果
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)
推荐阅读
- jquery - 我可以恢复 removeClass className.match 删除的以前的类吗?
- c++ - 模板 c++ 编译器差异 VC++ 不同输出
- css - 当填充/边距妨碍小屏幕上的内容时,你会怎么做?
- python - 虚拟环境中的 ModuleNotFoundError
- image-processing - 转换没有标题的原始图像
- python - python程序未完成执行
- python - 如何在 Keras 的预训练 CNN 模型中更改层的输出?
- reactjs - React Firebase 身份验证返回 null
- php - 在 foreach 中运行时返回无意义的数组数组
- javascript - 即使使用内联 JavaScript 函数 - Google ReCAPTCHA 也找不到用户提供的函数:函数(响应) -