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

时间:2016-10-07 18:40:15

标签: 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 = Math.min(prev, curr);

        return [min, max];
    });
}

我测试了它,它返回最小值或最大值就好了。但是当我尝试返回数组时,我得到[NaN,NaN]作为我的结果。我很难看到我弄乱的地方。此外,是的,我确实需要使用reduce(),即使有其他方法可以解决同样的问题。

请告诉我如何解决这个问题。谢谢!

5 个答案:

答案 0 :(得分:2)

首先,你没有传递任何东西来初始化reduce

其次,prev是两个元素的数组,如果您想获得prev[0]prev[1] 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]);
}

答案 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)

你犯了两个错误:

  1. 您获得的pre是数组[Min, Max],而不是数字。
  2. 您需要初始化pre [Min, Max]
  3. 以下更正:

    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]);
}