在Chrome中对超过10个对象的数组进行排序

时间:2014-04-15 07:07:35

标签: javascript arrays google-chrome sorting safari

[
{"tag":"fujairah","count":1},
{"tag":"worldwide","count":3},
{"tag":"saudi","count":1},
{"tag":"miami","count":1},
{"tag":"rwo-dealer","count":7},
{"tag":"new york","count":2},
{"tag":"surabaya","count":1},
{"tag":"phillippines","count":1},
{"tag":"vietnam","count":1},
{"tag":"norway","count":1},
{"tag":"x","count":1}
].sort(function(a,b){return a.tag>b.tag})

对10个对象的数组进行排序工作正常,一旦对象数超过10,Chrome for Mac中的排序就会失败。 Safari在任何阵列大小都失败。 (在Firefox中正常工作)

通过javascript排序对象数组的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

项目数量并不重要,可能只是你的情况。它只是不是实现排序功能的正确方法。你应该返回1(或任何正值,如果第一项是"大于"比第二项),-1(或任何负值)或0(如果项目相等)。尝试这样的事情:

.sort(function(a, b) {
    return a.tag > b.tag ? 1 : (a.tag < b.tag ? -1 : 0);
});

最后一个三元运算符周围的括号实际上并不是必需的。

答案 1 :(得分:2)

如接受的答案中所述,确保比较函数产生预期排序顺序的唯一方法是返回0以外的数字。

这个原因虽然很重要,但应该注意以供参考。 ECMA标准允许浏览器实现不稳定。因此,不能期望返回0的函数将导致原始排序顺序。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11

  

排序不一定稳定(即,比较相等的元素不一定保持原始顺序)。如果comparefn未定义,则它应该是一个接受两个参数x和y的函数,如果x&lt;则返回负值。 y,如果x = y则为零,或者如果x> y则为正值;收率

现在适用于Chrome(和其他人)。浏览器可以根据他们选择的标准使用他们想要的任何排序算法。由于某些算法基于阵列大小更有效,因此供应商可以根据阵列大小选择动态更改基础算法。这就是你看到这种行为的原因。

在撰写本文时,Chromium源使用length <= 10作为决定因素。

https://cs.chromium.org/chromium/src/v8/src/js/array.js?l=707&rcl=9c7cccf55126353a101f194bcf1f8826bc263804

function InnerArraySort(array, length, comparefn) {
  // In-place QuickSort algorithm.
  // For short (length <= 10) arrays, insertion sort is used for efficiency.
  ...
  if (to - from <= 10) {
    InsertionSort(a, from, to);
    return;
  }
 ...