【问题标题】:Sorting an array of numbers using .sort, but I don't know why this works [duplicate]使用.sort对数字数组进行排序,但我不知道为什么会这样[重复]
【发布时间】:2020-04-28 12:42:47
【问题描述】:

菜鸟问题。所以,我按升序对一组数字进行排序,但我不明白为什么会这样。

const sortYears = arr => {
  arr = (a, b) => {return a - b;}
}

const years = [1970, 1999, 1951, 1982, 1963, 2011, 2018, 1922];

console.log(years.sort(sortYears()));

a - b 究竟实现了什么?不只是返回另一个号码吗?它是如何突然对这些数字进行排序的?

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

a - bb - a产生的数字的作用是与0相关的:

  1. b === a - 项目彼此的顺序不会改变
  2. b - a < 0 - 将 a 移动到比 b 更低的索引
  3. b - a > 0 - 将 b 移动到比 a 更低的索引

但是,sortYears 函数返回undefined,因此不予考虑。虽然默认排序是升序。它通过将项目转换为字符串并将它们排序为字符串来创建。提供比较函数将确保它们按数字排序(注意数字 2 使用默认比较的位置):

const sortYears = () => (a, b) => a - b;

const years = [1970, 1999, 1951, 1982, 1963, 2011, 2, 2018, 1922];

console.log(years.sort(sortYears())); // with compare function
// [2,1922,1951,1963,1970,1982,1999,2011,2018]

console.log([...years].sort()); // using the default compare
// [1922,1951,1963,1970,1982,1999,2,2011,2018]

【讨论】:

  • 谢谢。我实际上并不是要那样输入它,而是我编辑了这个问题。但这有助于我理解为什么它没有按照我最初的预期降序排列。
  • 我已经更新了答案以解释为什么a - b 与默认比较不同。
【解决方案2】:

任意两年,比如 1970 年和 1963 年。1970 - 1963 给你一个正数。这意味着 1970 在列表中排在 1963 之后。 1963 - 1970 给你一个负数,所以 1963 在列表中排在 1970 之前。和这个是一样的:

 const sortYears = arr => {
    arr = (a, b) => {
        if(a - b > 0){
            return 1
        }else if (a - b < 0){
            return -1
        }else if(a - b === 0){
            return 0
        }
    }
}

【讨论】:

    【解决方案3】:

    默认情况下,sort() 方法按字母和升序将值排序为字符串。要很好地处理数字,您需要提供 比较函数 来定义替代排序逻辑。该函数应返回 negativezeropositive 值。

    检查你的功能:

    const sortYears = () => (a, b) => b - a;
    

    如果根据参数返回:

    • 负数:b值是较低的值
    • 正:b值是较大的值
    • 零:两个值相等

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2021-01-12
      • 2021-05-29
      • 1970-01-01
      • 2015-01-20
      • 2021-09-22
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多