Использование метода reduce() для нахождения минимальных и максимальных значений?
У меня есть код для класса, в котором я должен использовать метод 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 ответ(ов)
В ES6 вы можете использовать оператор распространения (spread operator). Вот одно из решений с использованием строки:
Math.min(...items);
Этот код позволяет передать элементы массива items
как отдельные аргументы в функцию Math.min
, что дает возможность получить минимальное значение из элементов массива.
Трюк заключается в том, чтобы предоставить пустой массив в качестве параметра 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
. Начальным значением для аккумулятора служит пустой массив. На каждой итерации мы проверяем, является ли текущее значение минимальным или максимальным, и обновляем соответствующий элемент аккумулятора.
Вы можете сделать это следующим образом. В функции может быть любое количество аргументов.
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
находит максимальное значение из переданных аргументов.
Вы можете использовать массив в качестве возвращаемого значения. Вот пример функции, которая находит минимальное и максимальное значения в массиве элементов:
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]
) - максимальное. В результате функция возвращает массив, содержащий минимальное и максимальное значения из исходного массива.
В вашем примере вы используете метод reduce
для поиска минимального значения в массиве чисел и для получения строки с наименьшей длиной в массиве строк. Однако есть некоторые нюансы, которые стоит упомянуть.
Вот как ваш код работает:
Поиск минимального числа:
const result = Array(-10, 1, 2, 3, 4, 5, 6, 7, 8, 9).reduce((a, b) => { return (a < b) ? a : b });
В этом случае
reduce
проходит по массиву и сравнивает каждое число с текущим минимальным значением, возвращая меньшее из них.Поиск строки с наименьшей длиной:
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
, не стесняйтесь задавать их!
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'
Как проверить, содержит ли массив строку в TypeScript?