Array.prototype.sort()返回错误的顺序

时间:2018-07-06 08:43:49

标签: javascript

我想对带有对象的数组进行排序。返回的订单有误。

$(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);

2 个答案:

答案 0 :(得分:8)

sort希望回调返回:

  • 如果a应该位于b之前为负数
  • 如果a应该放在b之后,则为正数
  • 如果ab等价于排序目的,则为零

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

您的

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>

答案 1 :(得分:-1)

您的排序条件不正确。使用a.position - b.position是因为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>