【问题标题】:Return value from sort function [duplicate]排序函数的返回值[重复]
【发布时间】:2019-02-18 15:38:48
【问题描述】:

我正在对一个数组进行排序,以便数组从小到大排序。

目前我愿意。

let arr = arr2.sort((a, b) => {
    if (a < b) {
        return -1;
    }
    return 0;
});

但我被告知要这样做

let arr = arr2.sort((a, b) => (
    a - b
));

这两种方法都可以正常工作,但我想弄清楚返回 a - b 与我的第一种方法是如何等效的。

【问题讨论】:

  • 这不是同一种方法,但它也尊重更大的值(返回值大于零)。
  • 如果第二种方法有效,我会感到惊讶,除非您返回 a.timestamp - b.timestamp
  • 第一种方法其实是错误的。返回0 意味着这两项是相等的,但不一定如此。由于以不同的顺序比较a, bb, a不会产生一致的结果,因此您可以从排序算法中得到错误的结果。
  • "这两个都可以正常工作" - 不,他们没有,这就是为什么你被告知使用第二个。它们不等效,第一个不起作用。
  • @HenryLee 你不知道,这就是重点。假设您有数组[1, 2, 3],排序算法可以调用compare(1, 2),但也可以调用compare(2, 1),具体取决于实现。如果其中一个告诉它1 更小,另一个告诉它2 == 1,它无法对元素进行排序。这就是为什么返回a - b 是一致的——compare(1, 2) 给你-1 或“1 更小”,而compare(2, 1) 返回1 或“2 更大”。无论哪种情况,逻辑结论都是相同的1 &lt; 2

标签: javascript


【解决方案1】:

您仍然需要比较相同的属性。虽然排序适用于同一个对象,但您不需要分配给新变量。两者共享相同的对象引用。

arr2.sort((a, b) => a.timestamp - b.timestamp);

只是一个补充,如果你只返回-10,你会欺骗排序算法,因为你省略了1。这会导致比可能需要更多的排序周期,或者根本是错误的!

// unpredictable                                                  EDGE CHROME/FF
console.log([4, 3, 2, 1].sort((a, b) => +(a > b)).join(' ')); //  desc    asc
console.log([4, 3, 2, 1].sort((a, b) => +(a < b)).join(' ')); //  desc   desc
console.log([4, 3, 2, 1].sort((a, b) => -(a > b)).join(' ')); //  desc   desc
console.log([4, 3, 2, 1].sort((a, b) => -(a < b)).join(' ')); //  asc    desc

// predictable right!
console.log([4, 3, 2, 1].sort((a, b) => a - b).join(' '));    //  asc     asc
console.log([4, 3, 2, 1].sort((a, b) => b - a).join(' '));    //  desc   desc

【讨论】:

  • That leads to more sorting cycles than maybe necessary or is simply wrong! 更可能是错误的。但是,谁知道呢。如果以不同顺序比较两个对象不会产生相似(翻转)的结果,则排序顺序未定义。排序可能会尝试比较 每一 对元素,但这不能保证 - 如果假定不需要某些比较,则可以跳过它们。例如,a 小于b 并且b 等于c,因此ac 之间不需要比较。
  • 那么a - b 的返回是否有效,因为每当它返回为
  • sort 需要一个数值,而不是布尔值(这将被转换为数字)。数字的增量只是一个代表两个值关系的值。
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2013-06-18
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2020-02-20
相关资源
最近更新 更多