【发布时间】:2018-08-24 00:10:08
【问题描述】:
我有以下代码:
let arr = [];
for (i = 14; i <= 31; i++) {
let d = "2018-08-" + String(i);
arr.push({
date: d
});
}
arr.sort((a, b) => a.date - b.date);
console.log(arr);
- 我知道
sort()应该只用于数字 - 我知道将字符串与
-进行比较是个坏主意 - 我已经本地化并修复了代码中的原始错误,但是...
这个有缺陷的代码让我着迷:结果。
从另一个字符串中减去一个字符串得到NaN,所以我希望数组保持不变(14, 15, 16, 17... 31),或者可能完全翻转(31, 30, 29, 28... 14)。
相反,实际(一致的)结果是
我很想知道为什么sort() 会输出该字符串序列。为什么31、15 和23 会被移动,为什么它们会被移动到这些特定位置?
【问题讨论】:
-
如果排序不稳定,这可能是算法的产物。如果你完全取消减法,只让比较函数返回一个常量,会发生什么?
-
@Carcigenicate 当然,但即使这是某种意外行为,它不应该是随机的吗?
-
您看到的是比较事物的顺序。由于排序实现不受标准规定,我们只能假设正在使用的任何算法都按此顺序查看对象。更多信息:stackoverflow.com/questions/234683/…
-
这可以简化为:
var arr = []; for (var i = 14; i <= 31; i++) arr.push(i); arr.sort((a, b) => "fubar"); console.log(arr)。我得到了同样的结果。我会发布一个小提琴,但 JS 小提琴在移动设备上是 derped。 -
规范中提到
If comparefn is not undefined and is not a consistent comparison function for the elements of this array (see below), the behaviour of sort is implementation-defined.和后来定义comparefn不能返回值v其中Type(v) is Number, and v is not NaN是一致的。鉴于您没有提供一致的排序功能,行为完全取决于特定的引擎实现,这应该与所有程序无关。换句话说,修复你的comparefn并完成它;)
标签: javascript arrays string sorting