首页 > 解决方案 > Array.prototype.sort() 返回错误的顺序

问题描述

我想用对象对数组进行排序。退回的订单是错误的。

$(document).ready(() => {
  const level = [
    new Stage(5, 23),
    new Stage(6, 25),
    new Stage(29, 27),
    new Stage(36, 33),
    new Stage(21, 37),
    new Stage(34, 51),
    new Stage(37, 54),
    new Stage(30, 58),
    new Stage(12, 68),
    new Stage(38, 70),
    new Stage(10, 47)
  ];

  level.sort((a, b) => a.position < b.position);
  console.log(level);
});

function Stage(stageId, stagePosition) {
  this.id = stageId;
  this.position = stagePosition;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

当我越来越多地混合数组时,数组得到正确排序

$(document).ready(() => {
  const level = [
    new Stage(38, 70),
    new Stage(5, 23),
    new Stage(29, 27),
    new Stage(36, 33),
    new Stage(34, 51),
    new Stage(37, 54),
    new Stage(12, 68),
    new Stage(21, 37),
    new Stage(6, 25),
    new Stage(10, 47)
  ];

  level.sort((a, b) => a.position < b.position);
  console.log(level);
});

function Stage(stageId, stagePosition) {
  this.id = stageId;
  this.position = stagePosition;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这是怎么发生的?另一个比较功能是

$(document).ready(() => {
  const level = [
    new Stage(5, 23),
    new Stage(6, 25),
    new Stage(29, 27),
    new Stage(36, 33),
    new Stage(21, 37),
    new Stage(34, 51),
    new Stage(37, 54),
    new Stage(30, 58),
    new Stage(12, 68),
    new Stage(38, 70),
    new Stage(10, 47)
  ];

  level.sort((a, b) => a.position - b.position);
  console.log(level);
});

function Stage(stageId, stagePosition) {
  this.id = stageId;
  this.position = stagePosition;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

不知何故,这总是有效的。

但是检查一个元素是否小于另一个元素或减法的结果是否小于 0 的区别在哪里。

目前这适用于真正混合的数组

level.sort((a, b) => a.position < b.position);

这很好用

level.sort((a, b) => a.position - b.position);

标签: javascript

解决方案


sort期望回调返回:

  • 负数 ifa应该在前面b
  • 一个正数 ifa应该在后面b
  • 零如果a并且b等价于排序目的

您的回调返回一个布尔值,而不是一个数字。该布尔值被强制转换为一个数字(true=> 1false=> 0),然后根据上述规则使用。根据您的浏览器实现的排序算法(规范中未定义确切的算法)和精确的输入数据,这可能会在有限的情况下工作,但不适用于不同的数据或稍微不同的算法。

您的

level.sort((a, b) => a.position - b.position);

是正确的方法(对于按 升序排序position)。

$(document).ready(() => {
  const level = [
    new Stage(5, 23),
    new Stage(6, 25),
    new Stage(29, 27),
    new Stage(36, 33),
    new Stage(21, 37),
    new Stage(34, 51),
    new Stage(37, 54),
    new Stage(30, 58),
    new Stage(12, 68),
    new Stage(38, 70),
    new Stage(10, 47)
  ];

  level.sort((a, b) => a.position - b.position);
  console.log(level);
});

function Stage(stageId, stagePosition) {
  this.id = stageId;
  this.position = stagePosition;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


推荐阅读