2017-06-24 11 views
1

配列内のすべての項目が同じ場合にのみ "true"を返す関数を作成しようとしています。
私はループためを使用しようと、私は偉大なforEeachループ
最初の作品を使用してみてください。
第2のものではない!
なぜですか?
この私の最初のコード:
"for"と "ForEach"を使用したjavascriptループスルー

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

この私の第二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])); 
+0

方法foreachループ内の値をログに記録し、何のチェックについて彼らです? –

+0

@ChrisSatchellは無関係です。問題は 'forEach'に戻ることができず、内側のクロージャーの戻りは外側のクロージャーに戻りません。 – charlietfl

答えて

6

あなたの第二の例ではreturn「インナー」forEachに渡された関数からのリターンです。 ではありません。isUniform機能からすぐに戻ります。代わりに、あなたがforEachに渡したこの小さな無名関数は、あなたの配列のすべての要素に対して完璧に実行されます。

すべての要素の実行が終了すると、isUniform関数はtrueを返します。

1

trueを返すと、forループがforループ中にforEach関数のコールバックにtrueが返され、関数に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));

+2

trueの間、これは質問に答えません。なぜ、それぞれ違うのですか? – Amy

+0

'' 'val'''を使うと、' '' first''''と同じように、字句を閉じることができます。絵に「this」をつけてしまうと文脈が汚れてしまい、コードを読んで紛らわしくなる。 – tevemadar

+0

@Amyは設計/定義のためです。 '' forEach'''は条件付き構造ではなく、/ etc/check/forward/store/accumulate/etcを気にしません。呼び出された関数が何を返しても。本当に '' forEach'''ループから壊れたければ、例外をスローすることができますが、良い解決策ではありません。 – tevemadar

-1

あなたはあなたがのforEachから壊すことができない、これを試してみてくださいxのVaRの要素を変更し、ラムダ

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

を使用することができます。

これを試してください。あなたは旗でそれを行うことができます。

var falg = false;

関数isUniform(進){

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

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の結果は完全に無視されます。 (コメント部分は、オプションのコンテキスト引数のサポートを追加します)

「より公式」ポリフィルは、いくつかの余分なチェックを行いますが、それはどちらか複雑ではありません。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill

関連する問題