簡體   English   中英

javascript通過“ for”和“ ForEach”遍歷數組

[英]javascript loop through array with “for” and “ForEach”

我試圖創建一個將數組作為參數的函數,並且僅當數組中的所有項目都相同時才返回“ true”。
我嘗試使用for循環 ,我嘗試使用forEeach循環
第一個作品很棒。
第二個沒有!
為什么?
這是我的第一個代碼:

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]));

在第二個示例中,“內部” return是傳遞給forEach的函數的返回。 不會導致從立即返回isUniform功能。 取而代之的是,您傳遞給forEach這個小匿名函數可以為數組的每個元素愉快地運行到完成。

完成所有元素的運行后, isUniform函數將簡單地返回true。

通過返回true,您將true返回到forEach函數回調,而您的for循環將true返回給該函數。 如果要使用當前方法,則forEach在執行回調時需要參考對象。 那就是它與for循環的不同之處。

 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])); 

您已經可以利用每個功能。

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

您無法脫離forEach。

試試這個。 您可以使用標志來實現。

var falg = false;

函數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]));

@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的結果被完全忽略。 (注釋部分增加了對可選上下文參數的支持)

“更正式”的polyfill會做一些額外的檢查,但也並不復雜: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill

您可以嘗試一下嗎,將var元素更改為x,並使用lambdas嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM