web-dev-qa-db-ja.com

Javascript:reduce()を使用して最小値と最大値を見つけますか?

クラスのこのコードは、reduce()メソッドを使用して配列内の最小値と最大値を見つけることになっています。ただし、1回の呼び出しのみを使用して削減する必要があります。戻り配列はサイズ2でなければなりませんが、reduce()メソッドは常にサイズ1の配列を返すことを知っています。以下のコードを使用して最小値を取得できますが、同じ呼び出しの最大値。 reduce()メソッドの終了後に配列にプッシュするだけで最大値を取得したと仮定します。

/**
 * Takes an array of numbers and returns an array of size 2,
 * where the first element is the smallest element in items,
 * and the second element is the largest element in items.
 *
 * Must do this by using a single call to reduce.
 *
 * For example, minMax([4, 1, 2, 7, 6]) returns [1, 7]
 */
function minMax(items) {
     var minMaxArray = items.reduce(
        (accumulator, currentValue) => {
             return (accumulator < currentValue ? accumulator : currentValue);
        }
    );

     return minMaxArray;
 }
15
Alyssa June

トリックは、initialValueパラメーターとして空の配列を提供することです。

arr.reduce(callback, [initialValue])

initialValue [オプション]コールバックの最初の呼び出しの最初の引数として使用する値。初期値が指定されていない場合、配列の最初の要素が使用されます。

したがって、コードは次のようになります。

function minMax(items) {
    return items.reduce((acc, val) => {
        acc[0] = ( acc[0] === undefined || val < acc[0] ) ? val : acc[0]
        acc[1] = ( acc[1] === undefined || val > acc[1] ) ? val : acc[1]
        return acc;
    }, []);
}
9
colxi

ES6では、スプレッド演算子を使用できます。 1つのストリングソリューション:

 Math.min(...items)
15
Sergey Zhukov

配列を戻り値として使用できます。

function minMax(items) {
    return items.reduce(
        (accumulator, currentValue) => {
            return [
                Math.min(currentValue, accumulator[0]), 
                Math.max(currentValue, accumulator[1])
            ];
        }, [Number.MAX_VALUE, Number.MIN_VALUE]
    );
}
6
Ilyas Kabirov

Math.min()およびMath.max()関数を使用したソリューション:

function minMax(items) {
    var minMaxArray = items.reduce(function (r, n) {
            r[0] = (!r[0])? n : Math.min(r[0], n);
            r[1] = (!r[1])? n : Math.max(r[1], n);
            return r;
        }, []);

    return minMaxArray;
}

console.log(minMax([4, 1, 2, 7, 6]));
3
RomanPerekhrest

Reduce呼び出しは実際にはまったく必要ないので、楽しんでください。

_let items = [62, 3, 7, 9, 33, 6, 322, 67, 853];

let arr = items.reduce((w,o,r,k,s=Math)=>[s.min.apply(0, k),s.max.apply(0, k)],[]);

console.log(arr);_

本当に必要なのはlet minMaxArray = [Math.min.apply(0,items), Math.max.apply(0,items)]だけです

2
adeneo

1. _Math.min_および_Math.max_のみを使用したソリューション:

⚠️これは、大きな配列を使用する場合、つまり "のように多くの引数でMath.min()を提供する場合は機能しません。JavaScriptエンジンの引数の長さの制限。引数が多すぎる(数万を超える引数を考える)関数を適用した結果はエンジンによって異なります(JavaScriptCoreには65536の引数制限がハードコードされています)制限(実際には、過度に大きなスタックの動作の性質も)は指定されていません。一部のエンジンは例外をスローします。 "MDN web docsから

_function minMax(items) {
  return [
      Math.min.apply(null, items),
      Math.max.apply(null, items)
  ]
}
_

...または、必要に応じて ES6のSpread構文

_const minMax = items => [
  Math.min(...items),
  Math.max(...items)
]
_

2. _Array.prototype.reduce_、_Math.min_、および_Math.max_を使用したソリューション

_function minMax(arr) {
  return arr.reduce(function(acc, cur) {
    return [
      Math.min(cur, acc[0]),
      Math.max(cur, acc[1])
    ]
  }, [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]);
}
_

...または短縮形:

_const minMax = items =>
  items.reduce((acc, cur) =>
    [Math.min(cur, acc[0]), Math.max(cur, acc[1])],
    [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]
  )

_

3.賢明な検証を含むソリューション

_function minMax(items) {
  let newItems = []
  const isArray = Array.isArray(items)
  const onlyHasNumbers = !items.some(i => isNaN(parseFloat(i)))

  // only proceed if items is a non-empty array of numbers
  if (isArray && items.length > 0 && onlyHasNumbers) {
    newItems = items.reduce(function(acc, cur) {
      return [
        Math.min(cur, acc[0]),
        Math.max(cur, acc[1])
      ]
    }, [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY])
  }
  return newItems
}
_

Math.min のドキュメント

Math.max のドキュメント

Array.prototype.reduce() のドキュメント

0
tobias

Reduce関数を使用して配列の最小値と最大値を取得するには

const ArrayList = [1, 2, 3, 4, 3, 20, 0];
const LargestNum = ArrayList.reduce((prev, curr) => {
      return Math.max(prev, curr)
});
const MinNum = ArrayList.reduce((prev,curr)=>{
      return Math.min(pre,curr)
});
console.log(LargestNum);
console.log(MinNum);
0
Ahmed Mahmoud