Javascript - 绕过排序尝试产生了奇怪的行为

时间:2016-08-31 12:40:03

标签: javascript google-chrome sorting

故事

我正在使用Choices库,除了一件小事之外它非常棒 - 当它被赋予select标签时它试图对所有选项进行排序。它接受两个字段来控制排序sortFieldssortFilter。从源代码看来,第一个选项似乎只用于搜索(我没有使用),所以我留下了第二个选项,它正在库构建模板之前传递给Array的sort函数。我认为给它function() { return 0 }应该做的伎俩(因为它会将所有元素视为相等,因此不会重新排序数组),但显然不是这样。

调查结果

当给定sort函数时,似乎constantly 0方法表现得非常奇怪。例子:

Chrome(Linux + Chrome 52.0.2743.82(64位)):

compare = function() {return 0};
[50,100,150,200,250,300,350,400,450,500].sort(compare)
> [50,100,150,200,250,300,350,400,450,500] // All fine up to 10 elements

[50,100,150,200,250,300,350,400,450,500,550].sort(compare)
> [300, 50, 150, 200, 250, 100, 350, 400, 450, 500, 550] // Can't even say what sort of order this is

在Firefox上一切正常。

这是Chrome错误吗?还有其他更好的方法只使用排序功能来禁用排序吗?

(是的,我正在修补图书馆的补丁,无需黑客攻击。问题纯粹是“学术”状态)

3 个答案:

答案 0 :(得分:1)

如果.sort()比较器返回0,则sort函数可以重新排序元素。 JavaScript .sort()机制不能保证稳定,不稳定的排序可以完全按照您的观察进行。

稳定排序是指在流程开始时不会重新排序已按顺序排列的元素的排序。

以这种方式思考:当比较器返回0时,排序机制将其解释为含义,"这两个元素具有相同的排序顺序,因此它们的顺序并不重要。重新进入"。

并非所有JavaScript运行时系统都使用相同的排序,因此平台之间的结果可能会有所不同。

答案 1 :(得分:1)

您可以在这里查看over here

项目长度的已知问题> 10,因为排序算法不同。

答案 2 :(得分:1)

Chrome的V8 JS引擎切换到插入排序,而不是快速排序短阵列:

  // Insertion sort is faster for short arrays.
  if (to - from <= 10) {
    InsertionSort(a, from, to);
    return;
  }

https://github.com/v8/v8/blob/30f8d3354334e7424324429d4e525a3b67b2b8bd/src/js/array.js#L809

要获得始终稳定的排序,您必须使用其他稳定排序功能,例如Underscore's sortBy