Javascript 计算最小值和最大值时获取空数组
我试图编写一个函数,使用reduce()方法在数组中查找最小值和最大值,然后返回一个大小为2的数组,其中第一个元素是最小值,第二个元素是最大值 例如,对于[3,2,1,4,5,6,7],我的函数需要返回[1,7] 我现在有以下代码Javascript 计算最小值和最大值时获取空数组,javascript,Javascript,我试图编写一个函数,使用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 =
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(),即使有其他方法可以解决同样的问题
请让我知道如何修理它。谢谢 您应该传递一个初始值,如
[Infinity,-Infinity]
。然后使用prev[0]
或prev[1]
获取之前的最小值或最大值
函数最小最大值(项目){
返回项目。减少(功能(上一个、当前、索引){
设min=Math.min(prev[0],curr);
设max=Math.max(prev[1],curr);
返回值[最小值,最大值];
},[Infinity,-Infinity]);
}
log(minMax([3,2,1,4,5,6,7])
使用扩展
运算符(…),可以将数字数组转换为一组参数,以传递给Math.min/Math.max
var数字=[3,2,1,4,5,6,7]
函数最小最大值(项目){
设max=Math.max(…项)
设min=Math.min(…项)
返回值[最小值,最大值]
}
log(minMax(numbers))
首先,您不需要传递任何东西来初始化reduce
其次,prev
是两个元素的数组,如果要获得min
和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]);
}
你犯了两个错误:
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
,因此pre是一个正好包含两个元素的数组[Math.max(…),Math.min(…)]
表示min,pre[0]
表示maxpre[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]
两个问题。第一个问题是prev需要是一个数组,第二个问题是没有初始值
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]);
}
OP提到他需要使用reduce;此外,
spread
是ES6的一部分,没有得到广泛支持;更不用说你可以通过简单的apply
@pwolaqI获得同样的结果。感谢你的评论,而不仅仅是否决投票。没有注意到需要减少的部分。同时感谢您提供的spread
信息。我想知道为什么您牺牲了可读性,删除了几乎所有不必要的空白字符,缩短了变量名,但没有注意到idx
没有在任何地方使用…@pwolaq这更具可读性。我保留了idx
以避免混淆OP。您能再解释一下为什么我必须执行pre[0]和pre[1]吗?pre不是数组中的值,而是数组对象吗?这是否意味着值仅为当前值?您的代码假定items
至少有一个元素。如果是这种情况,它将返回[undefined,undefined]。如果(items.length==0){error message},您可以添加if(items.length==0)。您的代码不正确。不知道你为什么会得到所有的UpVotes现在检查一下,我错误地替换了索引