【问题标题】:Using Math.max and Math.min to remove highest and lowest number from array使用 Math.max 和 Math.min 从数组中删除最高和最低数字
【发布时间】:2019-07-13 14:43:26
【问题描述】:

需要从数组中删除最高和最低的数字并将剩余的数字相加。 (重复值可以保留,例如 [2, 2, 3, 5, 8] 只删除 2 一次。)

创建 2 个单独的最小值和最大值,然后从数组总数中减去它们。

当数组为空时也应该返回0?

通过了一些测试,但看不出为什么它没有通过上面指定的所有标准?

function sumArray(array)
{
  var sum = 0;

  var min = Math.min(...array);  // lowest in array by spreading
  var max = Math.max(...array);  // highest in array by spreading

  if(array === null)
  {
    return 0;
  }
  for (var i = 0; i < array.length; i++ )
  {
    (sum += array[i]);  
  }
  return ((sum - max) - min);
}

【问题讨论】:

  • 实际上没有通过哪些标准?
  • 如果数组中的最大值或最小值出现多次,您的代码将无法工作。您应该将array[i]minmax 进行比较,如果这两个值都不是,则仅将其添加到sum
  • 显然您可以在代码中使用任何形式的大括号放置和缩进,但是在询问时不要使用上述样式求助。 (即使不寻求帮助,我也强烈建议不要使用它。)将结尾 } 放在块中最后一行的末尾会使其难以阅读并且难以移动代码。 Here's your code in a fairly standard style.
  • ^^ 也应该是答案的样式指南...
  • @TheWitness 传递了几乎所有数组类型,但偶尔会在它期望为 0 但得到 NaN 时失败。

标签: javascript arrays


【解决方案1】:

好吧,一方面,如果你需要这个检查:

if(array === null){
return 0;}

...您需要它上面的代码使用array

此外,您首先不应在sum 中包含minmax 值。您不能只减去它们 - 毕竟,一个值可能在数组中出现不止一次。 (例如,您的代码将得到错误的 [2, 2, 3, 4, 5] 结果,因为它计算了两次 2,但只减去了一次。)因此,与其在事后减去它们,不如添加 他们首先在循环中。

【讨论】:

  • 关于重复的最大值和/或最小值,人们可能会争辩说在这种情况下要求不明确。
  • @JackA。 - 也许。对我来说“需要从数组中删除最高和最低的数字并将剩余的数字相加。” 很清楚,但如果我正在写一个作业,我会让它明确。 :-) 在学校里,我总是把试卷交给老师,然后说“关于第 27 题……你是指 X 还是 Y?”因为这样的事情。 :-)
【解决方案2】:

我想,我不应该展示这个?

(因为这里有很多人可以做同样的答案)

function sumArray(array)
{
  if (array === null) return 0
  
  let sum = array.reduce((a,c)=>a+c) // sum array values
    , min = Math.min(...array)      // lowest in array by spreading
    , max = Math.max(...array)     // highest in array by spreading

  console.log({sum,min,max})

  return (sum - max - min)
}


console.log('sumArray',sumArray([2, 2, 3, 4, 5]))

【讨论】:

    【解决方案3】:

    Reduce 是对数组求和的更简单方法

    function sumArray(array) {
      // Nothing to do so we retrun zero
      if(!Array.isArray(array) || array.length == 0) return 0;
      
      var min = Math.min(...array);  // lowest in array by spreading
      var max = Math.max(...array);  // highest in array by spreading
    
      // Sum up the numbers in the array
      var sum = array.reduce((acc, val) => acc + val, 0);
    
      // Do the math
      return sum - max - min;
    }
    
    console.log(sumArray([2, 2, 3, 5, 8]))
    console.log(sumArray())
    console.log(sumArray([]))
    console.log(sumArray([0]))
    console.log(sumArray([null, 0, 12]))
    console.log(sumArray([null]))

    【讨论】:

    • 好的,现在必须学习这个!以前从未遇到过。谢谢你:)
    【解决方案4】:

    如果数组的长度为 1,我猜你的代码不符合标准。那时只能删除一个值,其余值的总和是0,但实际上你是减去它两次.

    同样在空数组的情况下,max()min() 将分别返回 -InfinityInfinity,它们的总和是 NaN 而不是 0。您的 === null 检查不会测试空数组([].length0),而是测试不存在的数组。

    所以为了解决这些问题,我会写

    function sumArray(array) {
      if (array.length <= 2) return 0;
    
      const min = Math.min(...array);
      const max = Math.max(...array);
    
      const sum = array.reduce((a,b) => a+b, 0);
    
      return sum - max - min;
    }
    

    如果您的函数也应该使用非数组值,例如 null 并为它们返回 0,请添加第二个检查:

      if (!Array.isArray(array) || array.length <= 2) return 0;
    

    【讨论】:

    • 可能想确保array 是一个数组
    • @GetOffMyLawn 我想到了这一点,但实际上 OP 描述的是一个总是获取数字数组的函数。我通常尽量不要因为防御性而使我的功能混乱,这会使代码更难阅读。
    • 在输入 TypeScript 之后,我已经习惯于进行所有这些类型的检查,这就是我一直这样做的原因。
    • @GetOffMyLawn 当然,使用打字稿我们会让我们的假设明确且可检查。但是在哪里停下来?我们还需要检查array.every(Number.isFinite)等吗?
    • 如果我们要构建一个公共的 npm 包,我猜可能是这样,但否则可能不必过火。
    【解决方案5】:

    您可以对数组进行排序并删除第一个和最后一个值,而不是单独识别最大值和最小值。

    您还可以将null 包装在一个数组中以避免在执行流程中创建特殊情况:

    const sumArray = arr =>
      (arr || Array.of(arr))
    	.sort((a, b) => a - b)
    	.slice(1, (arr && (arr.length - 1)))
    	.reduce((sum, n) => sum + n, 0)
    
    console.log(sumArray([2, 2, 3, 5, 8]))
    console.log(sumArray(null))
    console.log(sumArray([]))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多