我正在尝试编写一个函数,使用reduce()方法查找数组中的最小值和最大值,然后返回一个大小为2的数组,其中第一个元素是最小值,第二个元素是最大值。
例如,对于[3,2,1,4,5,6,7],我的函数需要返回[1,7]。
我现在有以下代码。
function minMax(items) {
return items.reduce(function(prev, curr, index){
let max = Math.max(prev, curr);
let min = Math.min(prev, curr);
return [min, max];
});
}
我测试了它,它返回最小值或最大值就好了。但是当我尝试返回数组时,我得到[NaN,NaN]作为我的结果。我很难看到我弄乱的地方。此外,是的,我确实需要使用reduce(),即使有其他方法可以解决同样的问题。
请告诉我如何解决这个问题。谢谢!
答案 0 :(得分:2)
首先,你没有传递任何东西来初始化reduce
其次,prev
是两个元素的数组,如果您想获得prev[0]
和prev[1]
max
>
这是正确的代码:
function minMax(items) {
return items.reduce(function(prev, curr, index){
let max = Math.max(prev[1], curr);
let min = Math.min(prev[0], curr);
return [min, max];
}, [Infinity, -Infinity]);
}
答案 1 :(得分:0)
您应该传递像[Infinity, -Infinity]
这样的初始值。然后使用prev[0]
或prev[1]
获取之前的最小值或最大值。
function minMax(items) {
return items.reduce(function(prev, curr, index) {
let min = Math.min(prev[0], curr);
let max = Math.max(prev[1], curr);
return [min, max];
}, [Infinity, -Infinity]);
}
console.log(minMax([3, 2, 1, 4, 5, 6, 7]));

答案 2 :(得分:0)
使用spread
运算符(...),您可以将数组数组转换为一组参数,以传递给Math.min / Math.max。
var numbers = [3, 2, 1, 4, 5, 6, 7]
function minMax(items){
let max = Math.max(...items)
let min = Math.min(...items)
return [min, max]
}
console.log(minMax(numbers))

答案 3 :(得分:0)
你犯了两个错误:
pre
是数组[Min, Max]
,而不是数字。pre
[Min, Max]
。以下更正:
a = [3, 2, 1, 4, 5, 6, 7]
a.reduce(function(pre, cur, idx) {
return [Math.min(pre[0],cur), Math.max(pre[1],cur)];
}, [a[0], a[0]])
// Outputs [1, 7]
说明:
pre
取决于我们返回的值。请注意,我们正在返回一个数组[Math.max(...), Math.min(...)]
,因此pre是一个恰好包含两个元素的数组。 pre[0]
表示 min ,pre[1]
表示最大。cur
由数组元素的类型决定。由于a
是一个数字数组,cur
是数字`为了进一步为您提供帮助,请按以下步骤进行操作:
a = [3, 2, 1, 4, 5, 6, 7]
a.reduce(function(pre, cur, idx) {
var r = [Math.min(pre[0],cur), Math.max(pre[1],cur)];
console.log("pre: ", pre, "cur: ", cur, "r: ", r)
return r
}, [a[0], a[0]])
// Output
pre: [3, 3] cur: 3 r: [3, 3]
pre: [3, 3] cur: 2 r: [2, 3]
pre: [2, 3] cur: 1 r: [1, 3]
pre: [1, 3] cur: 4 r: [1, 4]
pre: [1, 4] cur: 5 r: [1, 5]
pre: [1, 5] cur: 6 r: [1, 6]
pre: [1, 6] cur: 7 r: [1, 7]
[1, 7]
答案 4 :(得分:0)
function minMax(items) {
var first = items[0];
items.shift();
if (items.length == 0) {
return [first, first];
}
return items.reduce(function(prev, curr, index) {
let min = Math.min(prev[0], curr);
let max = Math.max(prev[1], curr);
return [min, max];
}, [first, first]);
}