Javascript: использование reduce () для поиска минимальных и максимальных значений?
У меня есть этот код для класса, где я должен использовать метод reduce() для поиска минимальных и максимальных значений в массиве. Однако мы должны использовать только один вызов для уменьшения. Возвращаемый массив должен иметь размер 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;
}
5 ответов
трюк состоит в предоставлении пустого массива в качестве параметра 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;
}, []);
}
вы можете использовать массив в качестве возвращаемого значения:
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]
);
}
решение с помощью 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]));
поскольку вызов reduce вообще не нужен, вы можете повеселиться с ним
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);
все, что вам действительно нужно, это let minMaxArray = [Math.min.apply(0,items), Math.max.apply(0,items)]