0

Использование метода reduce() для нахождения минимальных и максимальных значений?

12

У меня есть код для класса, в котором я должен использовать метод reduce(), чтобы найти минимальные и максимальные значения в массиве. Однако от меня требуется использовать только один вызов метода reduce. Возвращаемый массив должен состоять из двух элементов, но я знаю, что метод reduce() всегда возвращает массив размером 1.

Я смог получить минимальное значение с помощью следующего кода, однако не знаю, как получить максимальное значение в том же самом вызове. Я предполагаю, что после того, как я получу максимальное значение, я просто добавлю его в массив после завершения метода reduce.

Вот мой код:

/**
 * Принимает массив чисел и возвращает массив размером 2,
 * где первый элемент — это наименьший элемент в items,
 * а второй элемент — наибольший элемент в items.
 *
 * Необходимо сделать это с помощью единственного вызова reduce.
 *
 * Например, minMax([4, 1, 2, 7, 6]) возвращает [1, 7]
 */
function minMax(items) {
  var minMaxArray = items.reduce(
    (accumulator, currentValue) => {
      return (accumulator < currentValue ? accumulator : currentValue);
    }
  );

  return minMaxArray;
}

Как я могу изменить свой код, чтобы в одном вызове reduce() получить и минимальное, и максимальное значение, и вернуть их в массиве?

5 ответ(ов)

0

В ES6 вы можете использовать оператор распространения (spread operator). Вот одно из решений с использованием строки:

Math.min(...items);

Этот код позволяет передать элементы массива items как отдельные аргументы в функцию Math.min, что дает возможность получить минимальное значение из элементов массива.

0

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

В этом коде мы используем reduce для нахождения минимального и максимального значения в массиве items. Начальным значением для аккумулятора служит пустой массив. На каждой итерации мы проверяем, является ли текущее значение минимальным или максимальным, и обновляем соответствующий элемент аккумулятора.

0

Вы можете сделать это следующим образом. В функции может быть любое количество аргументов.

function minValue(...args) {
    const min = args.reduce((acc, val) => {
        return acc < val ? acc : val;
    });
    return min;
}

function maxValue(...args) {
    const max = args.reduce((acc, val) => {
        return acc > val ? acc : val;
    });
    return max;
}

Функция minValue принимает любое количество аргументов и находит минимальное значение, используя метод reduce. Аналогично, функция maxValue находит максимальное значение из переданных аргументов.

0

Вы можете использовать массив в качестве возвращаемого значения. Вот пример функции, которая находит минимальное и максимальное значения в массиве элементов:

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

В этой функции minMax применяется метод reduce, который последовательно обрабатывает элементы массива items. Начальное значение аккумулятора устанавливается в массив [Number.MAX_VALUE, Number.MIN_VALUE], что позволяет корректно находить минимальное и максимальное значения среди элементов. Для каждого элемента массива мы используем Math.min и Math.max, чтобы обновить значения: первый элемент массива (accumulator[0]) хранит минимальное значение, а второй (accumulator[1]) - максимальное. В результате функция возвращает массив, содержащий минимальное и максимальное значения из исходного массива.

0

В вашем примере вы используете метод reduce для поиска минимального значения в массиве чисел и для получения строки с наименьшей длиной в массиве строк. Однако есть некоторые нюансы, которые стоит упомянуть.

Вот как ваш код работает:

  1. Поиск минимального числа:

    const result = Array(-10, 1, 2, 3, 4, 5, 6, 7, 8, 9).reduce((a, b) => { return (a < b) ? a : b });
    

    В этом случае reduce проходит по массиву и сравнивает каждое число с текущим минимальным значением, возвращая меньшее из них.

  2. Поиск строки с наименьшей длиной:

    const result = Array("ere", "reeae", "j", "Mukono Municipality", "Sexy in the City and also").reduce((a, b) => { return (a.length < b.length) ? a : b });
    

    Здесь вы сравниваете длину каждой строки с текущей "самой короткой" строкой. В результате получится строка с наименьшей длиной.

Таким образом, оба примера демонстрируют, как можно использовать reduce для нахождения минимума, но с разными критериями (числа и длины строк).

Дополнительные замечания:

  • В случае, если массив пустой, reduce выбросит ошибку. Чтобы избежать этого, вы можете предоставить значение по умолчанию, добавив второй аргумент в reduce.
  • Код можно сделать более читаемым, используя стрелочные функции и тернарный оператор, как вы это уже сделали.

Если у вас есть еще вопросы по поводу использования reduce, не стесняйтесь задавать их!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь