嘿嘿!
我正在尝试对有时可能完全相等的数组进行排序。该函数在数组不相等时完美运行,但在完全相等时似乎随机放置元素。例如,我希望下面的代码打印出“a,b,c...”,但得到的结果却是:“k,a,c,d...”。这是 sort() 函数的预期行为吗?我怎样才能产生 'a,b,c...' 功能?谢谢!
var arrayToSort = [
{name: 'a', strength: 1}, {name: 'b', strength: 1}, {name: 'c', strength: 1}, {name: 'd', strength: 1},
{name: 'e', strength: 1}, {name: 'f', strength: 1}, {name: 'g', strength: 1}, {name: 'h', strength: 1},
{name: 'i', strength: 1}, {name: 'j', strength: 1}, {name: 'k', strength: 1}, {name: 'l', strength: 1},
{name: 'm', strength: 1}, {name: 'n', strength: 1}, {name: 'o', strength: 1}, {name: 'p', strength: 1},
{name: 'q', strength: 1}, {name: 'r', strength: 1}, {name: 's', strength: 1}, {name: 't', strength: 1}
];
arrayToSort.sort(function (a, b) {
return b.strength - a.strength;
});
arrayToSort.forEach(function (element) {
console.log(element.name);
});
最佳答案
排序算法的属性是让元素在其原始列表顺序中比较相等,称为稳定性。 JavaScript 规范特别允许实现使用不稳定的排序算法。
The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order).
现在,如何解决您的问题取决于您的情况。如果您知道您“喜欢”原始顺序,但没有对象的内在属性可以通过另一种排序为您提供该顺序,那么一个简单的方法是遍历数组并添加另一个包含原始数组索引的属性。然后您可以将该索引用作辅助排序键。排序后的最后一次传递可以删除 key (如果需要)。
关于javascript - 当元素相等时,Array.sort() 会产生意想不到的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27071942/