没有最高和更低数字js的Sum数组

时间:2018-02-17 14:50:20

标签: javascript arrays

我试图解决任务(除了最高和最低元素(值,而不是索引!)之外,总结所有数组的数字(在F#和Haskell中你得到一个列表)。 (最高/最低元素在每个边缘分别只有一个元素,即使有多个元素具有相同的值!)

这是我的代码,但我收到了NaN



function sumArray(array) {
  var sum;
  array.sort(function(a, b) {
    return a - b
  });
  for (var i = 1; i < array.length - 2; i++) {
    return sum += array[i];
  }

}
console.log(
  sumArray([6, 2, 1, 8, 10])
)  
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

一些问题:

  • sum需要一个初始值,即0
  • return 循环中,所以循环只能进行一次迭代,......永远。在循环之后移动它
  • 您没有总结一个而是最后一个(有序)值。使用i < array.length - 1
  • 您的算法依赖于sort,这使得它的复杂时间为 O(nlogn)。如果您使用Math.minMath.max,则可以在 O(n)中执行此操作:

function sumArray(array) {
    return array.length < 2 ? 0
         : array.reduce((a, b) => a + b) - Math.min(...array) - Math.max(...array);
}
console.log(
    sumArray([6, 2, 1, 8, 10])
)  

注意:这是所有主流浏览器都支持的ES6代码,IE是一个值得注意的例外。

对于旧版浏览器:

function sumArray(array) {
    return array.length < 2 ? 0
         : array.reduce(function (a, b) {
               return a + b;
           }) - Math.min.apply(null, array) - Math.max.apply(null, array);
}
console.log(
    sumArray([])
)  

对于非常大的数组,可能需要通过reduce获取最小值和最大值,因为可以传递给函数调用的参数数量是有限的。

答案 1 :(得分:0)

  1. 初始化sum = 0
  2. 将返回移至循环外
  3. 循环直到<length-1,而不是2
  4. 注意在第二个例子中,我使用reduce来获得max和min,因为

      

    如果数组元素太多,则spread(...)和apply将失败或返回错误的结果,因为它们尝试将数组元素作为函数参数传递。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

    &#13;
    &#13;
    function sumArray(array) {
      var sum = 0;
      array.sort(function(a, b) {
        return a - b
      });
      for (var i = 1; i < array.length - 1; i++) {
        sum += array[i];
      }
      return sum;
    }
    console.log(
      sumArray([6, 2, 1, 8, 10])
    )
    
    // or not sorting
    let arr = [6, 2, 1, 8, 10];
    const max = arr.reduce(function(a, b) {
      return Math.max(a, b);
    })
    const min = arr.reduce(function(a, b) {
      return Math.min(a, b);
    })
    let sum = arr.reduce(function(a, b) {
      return a + b;
    }, 0); // add 
    sum -= (min + max);
    console.log(sum)
    
    // using one reduce (https://stackoverflow.com/a/43576388/295783):
    let minmax = arr.reduce(
      (accumulator, currentValue) => {
        return [
          Math.min(currentValue, accumulator[0]),
          Math.max(currentValue, accumulator[1])
        ];
      }, [Number.MAX_VALUE, Number.MIN_VALUE]
    )
    sum = arr.reduce(function(a, b) {
      return a + b;
    }, 0); // add 
    sum -= (minmax[0] + minmax[1]);
    console.log(sum)
    &#13;
    &#13;
    &#13;