Javascript 计算最小值和最大值时获取空数组

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 =

我试图编写一个函数,使用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(),即使有其他方法可以解决同样的问题


请让我知道如何修理它。谢谢

您应该传递一个初始值,如
[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
      由我们返回的值决定。请注意,我们返回的是一个数组
      [Math.max(…),Math.min(…)]
      ,因此pre是一个正好包含两个元素的数组
      pre[0]
      表示min
      pre[1]
      表示max
    • 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现在检查一下,我错误地替换了索引