【发布时间】:2018-02-09 19:28:51
【问题描述】:
使用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 中看到,结果也不同:
谷歌浏览器 63
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
微软边缘 25
["Edward", "Sharpe", "And", "The", "Magnetic", "Zeros"]
["Sharpe", "And", "The", "Magnetic", "Zeros", "Edward"]
知道是什么原因造成的或如何解决?
您可以在以下JSBin中测试此行为
【问题讨论】:
-
您认为您实际上在此处对 by 进行了哪些排序?您不会认为您是按
name属性排序的,对吧?您正在使用对象比较进行排序。 -
你要找的是
items.sort((a.b) => a.name.localeCompare(b.name)) -
@CBroe,按 nothing 排序。所以我希望得到像 Chrome 一样的结果。我使用“名称”只是为了显示结果。
-
你不能按“无”排序,这甚至没有意义。引用自 MDN,“如果省略 [compareFunction],则数组按照每个字符的 Unicode 码位值,按照每个元素的字符串转换进行排序。” 你的元素在这里是对象,所以它们的字符串转换将为每个项目生成
[object Object]- 因此您的每个项目都有相同的比较值开始,它们都不比另一个“更小”或“更大”。所以你得到什么结果取决于浏览器实际使用的排序算法是否是一个稳定的。
标签: javascript google-chrome sorting cross-browser microsoft-edge