Javascript: С помощью reduce() можно найти значения min и max?

У меня есть этот код для класса, где я должен использовать метод reduce() для поиска значений min и max в массиве. Однако мы должны использовать только один вызов для сокращения. Возвращаемый массив должен иметь размер 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;
 }

Ответы

Ответ 1

Трюк состоит в том, чтобы предоставить пустой массив как параметр 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;
    }, []);
}

Ответ 2

В ES6 вы можете использовать оператор спреда. Одно струнное решение:

 Math.min(...items)

Ответ 3

Вы можете использовать массив как возвращаемое значение:

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

Ответ 4

Решение с использованием 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]));

Ответ 5

Поскольку вызов вызова вообще не нужен, вы можете немного повеселиться с ним

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

Ответ 6

1. Решение с использованием только Math.min и Math.max:

⚠️ Это не сработает, если вы используете большие массивы, т. Math.min() множеством аргументов, так как " вы рискуете превысить ограничение длины аргумента движка JavaScript. Последствия применения функции со слишком большим количеством аргументов (подумайте больше"). чем десятки тысяч аргументов) различаются в разных движках (JavaScriptCore имеет жестко запрограммированный предел аргументов 65536), потому что предел (даже природа любого чрезмерно большого стека) не определен. Некоторые движки выдают исключение ". из MDN веб-документов.

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

Ответ 7

Чтобы получить минимальное и максимальное значение массива, используя функцию 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);

Ответ 8

Я знаю, что на этот вопрос ответили, но я ушел от ответа @Sergey Zhukov (который кажется неполным) и смог получить минимальное и максимальное значения в 2 строки:

let vals = [ numeric values ]
let min = Math.min.apply(undefined, vals) 
let max = Math.max.apply(undefined, vals)

Я вижу значение в Array.reduce, но с таким очень простым Array.reduce использования, и до тех пор, пока вы понимаете, что делает Function.apply, это было бы моим goto решением.