意外的不同结果array.sort()Chrome / Edge

时间:2018-02-09 10:59:11

标签: javascript google-chrome sorting cross-browser microsoft-edge

使用sort获取此Javascript代码:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic' },
  { name: 'Zeros', value: 37 }
];

console.log(items.map(x=>x.name.toString()));

items.sort();

console.log(items.map(x=>x.name.toString()));

即使我们可以在both browsers are compatible中看到,结果也不同:

Google Chrome 63

["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]

Microsoft Edge 25

["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Sharpe", "And", "The", "Magnetic", "Zeros", "Edward"]

知道是什么导致了这个或如何解决它?

您可以在以下JSBin

中测试此行为

1 个答案:

答案 0 :(得分:2)

  

知道造成这种情况的原因

来自MDN的报价:

  

如果省略[compareFunction],则根据每个元素的字符串转换,根据每个字符的Unicode代码点值对数组进行排序。

您的元素是此处的对象,因此它们的字符串转换将为每个元素生成字符串值[object Object] - 因此您的每个项目都具有相同的比较值,无需开始他们比另一人“更小”或“更大”。

那么得到的结果取决于浏览器使用的实际排序算法是否为稳定。 (另见这个问题,What is stability in sorting algorithms and why is it important?

https://medium.com/@fsufitch/is-javascript-array-sort-stable-46b90822543f

  

嗯,在ES7规范中没有任何地方说它是否需要稳定。事实上,它试图超级抽象,允许尽可能多的“实现定义”。这导致不同的JS引擎(跨不同浏览器)采用不同的路由来实现此规范,导致排序稳定性行为不一致。

  

或如何解决?

您需要实施自己的稳定排序算法。

但您还需要使用自行编写的比较函数来正确比较您的对象,因为正如您现在所说的那样,您只是将[object Object][object Object]进行比较......