用“for”和“ForEach”循环遍历数组的javascript

时间:2017-06-24 23:38:35

标签: javascript arrays for-loop foreach

我正在尝试创建一个以数组作为参数的函数,并且仅当数组中的所有项都相同时才返回“true”。
我尝试使用 for loop ,我尝试使用 forEeach loop
第一个工作很棒。第二个不工作! 的为什么吗
这是我的第一个代码:

function isUniform(ary) {
    var first = ary[0];
    for (i = 0; i < ary.length; i++) {
        if (first !== ary[i]) {
            return false;
        }
    }
        return true;
}
console.log(isUniform([1, 2, 1]));

这是我的第二个:

function isUniform(ary) {
    var first = ary[0];
    ary.forEach(function(element) {
        if (first !== element) {
            return false;
        }
    });
    return true;

}
 console.log(isUniform([1, 2, 1]));

5 个答案:

答案 0 :(得分:6)

&#34;内部&#34;第二个示例中的return是从传递给forEach的函数返回的。 会导致isUniform函数立即返回。相反,您传递给forEach的这个小匿名函数很快就会为数组的每个元素运行完成。

完成所有元素的运行后,您的isUniform函数会返回true。

答案 1 :(得分:1)

通过返回true,您将返回true到forEach函数回调,而您的for循环将返回true返回该函数。如果要使用当前方法,则在执行回调时,forEach需要引用对象。这就是它与你的for循环的不同之处。

&#13;
&#13;
function isUniform(ary) {
  var first = ary[0];
  val = true;
  ary.forEach(element => {
    if (first !== element) {
      val = false;
    }
  });
  return val;
}
console.log(isUniform([1, 1, 1]));

console.log(isUniform([1, 2, 1]));
&#13;
&#13;
&#13;

您可以利用所有功能。

&#13;
&#13;
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

arr2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];

console.log(arr1.every((a, _, aa) => aa[0] === a));
console.log(arr2.every((a, _, aa) => aa[0] === a));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你无法打破forEach。

试试这个。你可以用旗帜做到这一点。

var falg = false;

function isUniform(ary){

var first = ary[0];

ary.forEach(function(element) {

    if (first !== element) {

        falg = true;

        return false;

    }

});

if(falg)

    return false

return true;

}

console.log(isUniform([1,2,1]));

答案 3 :(得分:0)

@ Arrow的帖子已经解决了部分问题,如果你使用forEach,它不关心返回值,你必须自己积累结果(同样,没有'正常'从循环中突破的方法,但如果你真的想要,你可以抛出一个异常。

对于'为什么'部分:因为定义。 forEach不关心返回值,并且无条件地运行所有元素的传递函数。

forEach的简化实现如下:

Array.prototype.myForEach=function(callback){ // or callback,diz
  for(var i=0;i<this.length;t++)
    callback(this[i],i,this);                 // or callback.call(diz,this[i],i,this);
}

完全忽略callback的结果。 (注释部分添加了对可选context-argument的支持)

'更官方'的polyfill会做一些额外的检查,但也不复杂:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill

答案 4 :(得分:-1)

你可以尝试这个,改变x的var元素,并使用lambdas

    function isUniform(ary) {
     var first = ary[0];
     ary.forEach((x) => {
         if(first !== x){
             return false;
         }
     });
     return true;
    }