2017-01-20 12 views
0

こんにちは私は両方の出力が真であるかどうかを確認するためにいくつかのテストを行っています。Javascript forEachは通常のループと同じ出力を与えません

var callback = function (num) { 
 
\t return num % 2 === 0 
 
} 
 

 
console.log($$$.any([1, 3, 4], callback) === true) 
 
console.log($$$.any([1, 11, 111], callback) === false)

私は本当のどちらの場合も、結果として与える関数を作成する必要があります事は、これらの条件与えられたということです。私は、forループでそれをやったが、私はforEachのと同じ結果を得ることができない、理由は?:その2番目のバージョンで

+0

ステップで、あなたのプログラムステップを歩くためにデバッガを使用してください。 –

+0

"エラー/タイプミスはできません"クローズ理由を使用した人は間違っています。これは_logic_エラーです。 – Alnitak

答えて

1

// My for loop function: 
 

 
$$$ = { 
 
\t \t any: function (arr, callback) { 
 
\t \t for (var i = 0, l = arr.length; i < l; i ++) { 
 
\t \t \t \t if (callback(arr[i])) { 
 
\t \t \t \t return true; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t return false; 
 
\t \t } 
 
} 
 

 
// My forEach function: 
 

 
$$$={ 
 
\t any: function(array, callback){ 
 
\t \t array.forEach(function(value){ 
 
\t \t \t // console.log(value) 
 
\t \t \t if (callback(value)) { 
 
\t \t \t \t return true; 
 
\t \t \t } 
 
\t \t \t // return false; 
 
\t \t }) 
 
\t \t return false; 
 
\t } 
 
}
、内部コールバック関数で return trueそのコールバック関数からのみ戻り、外部関数が返されることはありません。

.forEachループが完了するまで実行した後、常に戻りfalse.any機能そのものます。

FWIW、.forEachは、一致が見つかるとすぐに要素に対して反復処理を終了させる方法がないため、.any関数に実際には適していないため、効率が低下します。たとえば、10000要素の配列があるかもしれませんが、.forEachを使用すると、最初の要素が述語を満たしていてもループし続けます。あなたが本当に.forEachを使用する必要がある場合は、言っ

、しかし、解決策は次のようになります。少なくとも一度マッチが発見され、ユーザが指定したコールバックを呼び出さないようにすることができ、さらに最適化

function all(array, callback) { 
    var result = false; 
    array.forEach(function(value) { 
     if (callback(value)) { 
      result = true; 
     } 
    }); 
    return result; 
} 

function all(array, callback) { 
    var result = false; 
    array.forEach(function(value) { 
     if (!result && callback(value)) { 
      result = true; 
     } 
    }); 
    return result; 
} 

NB:JavaScriptはすでに必要なものを行う関数を持っている - Array.prototype.some

+0

OK、何のためのdownvoteですか? – Alnitak

+0

それで、forEachで同じ結果を得る方法はありませんか? – Defoe

+0

@Defoeがあります。外部スコープで最初に 'false'に設定されている変数を持つことによって、述語が一致する場合にコールバック内で' true'に設定され、次にその変数を返します。しかし、上記で概説した効率の理由から、あなたはすべきではありません。 – Alnitak

関連する問題