javascript - 当元素相等时,Array.sort() 会产生意想不到的结果吗?

标签 javascript arrays sorting

嘿嘿!

我正在尝试对有时可能完全相等的数组进行排序。该函数在数组不相等时完美运行,但在完全相等时似乎随机放置元素。例如,我希望下面的代码打印出“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 规范特别允许实现使用不稳定的排序算法。

From the spec:

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/

相关文章:

javascript - 使用两个数组在 javascript 中分配两个不同的值

javascript - 按键排序映射返回排序后的 Map 对象,其第一个键位于最后一个索引中

ruby-on-rails - Rails : ActiveAdmin sort by index, 然后通过自定义方法值

c++ - 查看固定长度数组之间有多少字节相等的最快方法

linux - 使用 Unix 排序对科学数字进行排序

bash - 在 Bash 中按字母顺序排序

JavaScript - 如何检查一个字符串是否是另一个字符串的一部分或等于另一个字符串

javascript - 如何使用 Javascript RegExp 匹配和替换包含子字符串的整个单词

javascript - 为什么相同的 RegExp 表现不同?

javascript - 如何在javascript中收集对象数组