2017-11-12 2 views
1

変数minには、指定された配列内の4つの最小項目の合計が含まれます。 変数maxには、指定された配列内の4つの最大項目の合計が含まれます。特定のユースケースをテストした後に初期値のない空の配列を減らす

JS:

function main() { 
    const arr = [1, 2, 3, 4, 5] 
    const min = arr.sort().filter((element, index, array) => element !== array[array.length - 1]).reduce((accumulator, currentValue) => { 
    return accumulator + currentValue 
    }) 
    const max = arr.sort().filter((element, index, array) => element !== array[0]).reduce((accumulator, currentValue) => { 
    return accumulator + currentValue 
    }) 
    console.log(min, max) 
} 

main() 

予想されたように、[1,2,3,4,5]が所与の配列が[5,5,5,5,5]である場合は、プログラムはTypeError: Reduce of empty array with no initial valueを返すであろう10、14をもたらすであろう。

これはなぜですか?

ありがとうございました。

+0

なぜでコードブロックを置き換えますか? .reduceに初期値を指定していないので、その関数に2番目のパラメータとして0を入れるだけです。 //また、あなたのフィルタリングロジックは、あなたが与えた目標説明と一致しませんが、それはまったく別のものです。 – c69

+0

https://stackoverflow.com/questions/43576241/javascript-using-reduce-to-find-min-and-max-values – c69

+1

配列に '5'要素が含まれていることを忘れたと思いますか? – CodeYogi

答えて

3

すべての要素が同じ場合、 の条件element !== array[array.length - 1]は、すべての要素がすべて最後の要素と同じであるため、すべての要素に対してfalseになります。 したがって、filter(...)の結果は空の配列 になります。そのため、取得したエラーが発生します。

実際、この実装にはかなりの欠陥があります。 むしろ要素値よりもindexで作業する方が良いでしょう:

function main(arr) { 
    const count = 4; 

    const sorted = arr.sort((a, b) => a - b); 

    const sum = (accumulator, currentValue) => accumulator + currentValue; 

    const min = sorted 
    .filter((element, index) => index < count) 
    .reduce(sum); 

    const max = sorted 
    .filter((element, index) => index >= arr.length - count) 
    .reduce(sum); 

    console.log(min, max); 
} 

main([1, 2, 3, 4, 5]); 
main([5, 5, 5, 5, 5]); 

私もいくつかの他の改善に滑っ:

  • を簡単にテスト
  • の配列関数のパラメータを、確認します
  • @Andrewがコメントで指摘されているように、arr.sort()は整数を正しくソートしないため、コンパレータ関数に渡す必要があります。
  • が重複ロジックを減らして意図した効果を得る:sum機能を抽出し、変数count
  • インラインラムダ式
+0

ありがとう@Andrew、私はそれを見落としました、今確定しました – janos

+0

'arr.length'もキャッシュできますか? – CodeYogi

+0

@ CodeYogi何か改善がもたらされるかもしれないが、私はそれが無視できると思う。 – janos

関連する問題