2017-04-23 7 views
5

私はこのクラスを使って、reduce()メソッドを使って配列の最小値と最大値を探します。しかし、私たちは減らすために1回の呼び出しだけを使用する必要があります。戻り値の配列はサイズ2でなければなりませんが、reduce()メソッドは常にサイズ1の配列を返します。以下のコードを使用して最小値を取得できますが、同じ呼び出しで最大値を返します。私は、一度最大値を取得すると、reduce()メソッドの終了後に配列にプッシュすると仮定します。Javascript: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; 
} 
+0

実際に質問をしていないようです。 [ask]を確認してください。 – zzzzBov

+4

'しかし、reduce()メソッドは常にサイズ1の配列を返します。これは間違っています。また、reduceは、コールバックを使って配列を繰り返し処理する方法に過ぎません。イテレータで使用できる 'minMax'メソッドの範囲内にある他の変数について考えてみてください。ヒント:あなたの説明から、 'reduce 'の戻り値を必ずしも使う必要はありません。 – Adam

+0

[reduce()docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=control)を読み、 'initValue'の' accumulator' – charlietfl

答えて

2

トリック

arr.reduce(callback, [initialValue]) 
は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; 
    }, []); 
} 
+0

この答えは数字だけでなく、任意の順序付けされた型(文字列など)を扱うという利点があります。これはすばらしい一般化です。可能な最適化の1つは 'initialValue'を' [items [0]、items [0]] 'にすることで、特殊なケーシング' undefined'を避けることができ、 'if(val '0' = val; 'と' if(val> acc [1])acc [1] = val; ' – ShadowRanger

1

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

2

あなたは戻り値として配列を使用することができます。

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] 
    ); 
} 
+1

+1 'ですが、MIN_VALUEは混乱して最小*正の値( > 0)。あなたは 'Number.INFINITY'と' Number.NEGATIVE_INFINITY'をよく使うでしょう。 – Bergi

1

減らすコールは本当に全く必要とされていないとして、あなたは可能性がそれを楽しみなさい

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

あなたが本当に必要があると思いますすべての210を使用すると、スプレッド演算子を使用することができますlet minMaxArray = [Math.min.apply(0,items), Math.max.apply(0,items)]

+0

ありがとう! – vuvu

2

ES6です。 1つの文字列のソリューション:

Math.min(...items) 
関連する問題