使用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中看到,结果也不同:
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Sharpe", "And", "The", "Magnetic", "Zeros", "Edward"]
知道是什么导致了这个或如何解决它?
您可以在以下JSBin
中测试此行为答案 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]
进行比较......