Frage Javascript: Mit reduce () Min- und Max-Werte finden?


Ich habe diesen Code für eine Klasse, wo ich die reduce () -Methode verwenden soll, um die Min- und Max-Werte in einem Array zu finden. Wir müssen jedoch nur einen einzigen Anruf zur Reduzierung verwenden. Das Rückgabearray sollte die Größe 2 haben, aber ich weiß, dass die reduce () -Methode immer ein Array der Größe 1 zurückgibt. Ich bin in der Lage, den Mindestwert mit dem unten stehenden Code zu erhalten, aber ich weiß nicht, wie ich das bekomme Max-Wert in demselben Anruf. Ich gehe davon aus, dass sobald ich den maximalen Wert, den ich es nur auf das Array drücken, nachdem die reduce () -Methode beendet ist.

/**
 * 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;
 }

7
2018-04-23 20:37


Ursprung


Antworten:


Der Trick besteht darin, ein leeres Array als initialValue Parameter bereitzustellen

arr.reduce(callback, [initialValue])

initialValue [Optional] Wert, der als erstes Argument für die   erster Aufruf des Callbacks. Wenn kein Anfangswert angegeben wird, der erste   Element im Array wird verwendet.

Also würde der Code so aussehen:

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;
    }, []);
}

6
2018-04-23 20:50



Im ES6 Sie können den Spread-Operator verwenden. Eine String-Lösung:

 Math.min(...items)

9
2017-11-22 19:37



Die Lösung mit Math.min() und Math.max() Funktionen:

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
2018-04-23 20:47



Sie können Array als Rückgabewert verwenden:

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

3
2018-04-23 20:54



Da der Reduce-Call überhaupt nicht benötigt wird, könnte es Spaß machen

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

Alles was du wirklich brauchst ist let minMaxArray = [Math.min.apply(0,items), Math.max.apply(0,items)]


1
2018-04-23 21:24