代码之家  ›  专栏  ›  技术社区  ›  James Barrett

测试特定用例后减少没有初始值的空数组

  •  2
  • James Barrett  · 技术社区  · 8 年前

    变量 min 变量 max 将包含给定数组中4个最大项的总和。

    JS:

    function main() {
      const arr = [1, 2, 3, 4, 5]
      const min = arr.sort().filter((element, index, array) => element !== array[array.length - 1]).reduce((accumulator, currentValue) => {
        return accumulator + currentValue
      })
      const max = arr.sort().filter((element, index, array) => element !== array[0]).reduce((accumulator, currentValue) => {
        return accumulator + currentValue
      })
      console.log(min, max)
    }
    
    main()
    

    [1,2,3,4,5] 结果是10,14。但是,如果给定的数组是 [5,5,5,5,5] ,程序将返回 TypeError: Reduce of empty array with no initial value .

    为什么会这样?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  3
  •   janos slartidan    8 年前

    当所有元素都相同时, 条件 element !== array[array.length - 1] 对于所有元素都将为false,因为所有元素都与最后一个相同。 因此 filter(...) 将是一个空数组, 所以你得到了你得到的错误。

    事实上,这种实现有很大的缺陷。 最好与 index 而不是元素值:

    function main(arr) {
      const count = 4;
    
      const sorted = arr.sort((a, b) => a - b);
    
      const sum = (accumulator, currentValue) => accumulator + currentValue;
    
      const min = sorted
        .filter((element, index) => index < count)
        .reduce(sum);
    
      const max = sorted
        .filter((element, index) => index >= arr.length - count)
        .reduce(sum);
    
      console.log(min, max);
    }
    
    main([1, 2, 3, 4, 5]);
    main([5, 5, 5, 5, 5]);
    

    我还加入了其他一些改进:

    • 使数组成为函数的参数,以便于测试
    • 不要对数组进行两次排序,一次就足够了
    • @Andrew 在评论中指出, arr.sort() 如果不能正确排序整数,则需要向其传递一个比较器函数以获得预期效果
    • 减少重复逻辑:提取 sum 功能和 count
    • 用内联lambda表达式替换代码块