据我所知,我可以通过创建嵌套数组,以更实用的方式对数组进行排序:
[ [value,frequency], [value,frequency] ]
按频率排序。
然而,我试图使用另一种方法,因为它在我的头脑中是有意义的,但由于某种原因,我无法理解为什么它不能始终如一地工作。
几项测试正在回归这些令人费解的结果:
function arrOrd(arr){
var arr_s=arr.sort(
function(a,b) {
var u=arr.filter(x=> x==a).length;
var v=arr.filter(x=> x==b).length;
return u-v;
})
return arr_s;
}
console.log(arrOrd([2,3,5,3,7,9,5,3,7]).toString()); // ==>[9,2,7,7,5,5,3,3,3]
console.log(arrOrd([4,4,2,5,1,1,3,3,2,8]).toString()); // ==>[8,5,4,4,2,1,1,3,3,2]
console.log(arrOrd([4,9,5,0,7,3,8,4,9,0]).toString()); // ==>[8,3,7,5,4,9,0,4,9,0]

我认为这里有一个新的概念,我没有理解,因为我似乎无法自己找到解决方案。一如既往,感谢您的耐心和帮助。
答案 0 :(得分:1)
排序期间数组的状态是实现定义的。每the spec:
- 醇>
执行依赖于实现的调用序列[[Get]] 和[[Set]] obj的内部方法,到DeletePropertyOrThrow和 HasOwnProperty抽象操作用obj作为第一个参数,和 到SortCompare(如下所述),这样:
- 每次调用[[Get]],[[Set]],HasOwnProperty或DeletePropertyOrThrow的属性键参数是字符串表示形式 一个小于len的非负整数。
- 调用SortCompare的参数是先前调用[[Get]]内部方法返回的值,除非属性 根据以前的呼叫访问不存在 HasOwnProperty。如果两个透视[sic]参数为SortCompare 对应于不存在的属性,使用+0而不是调用 SortCompare。如果只有第一个透视参数不存在 使用+1。如果只有第二个透视参数不存在则使用 -1。
- 如果obj不稀疏,则不得调用DeletePropertyOrThrow。
- 如果任何[[Set]]调用返回false,则抛出TypeError异常。
- 如果从这些操作中返回任何突然完成,则会立即将其作为此函数的值返回。
换句话说,JavaScript引擎的完全有效的排序实现是制作数组的副本,用"hi"
替换原始文件中的所有元素,对副本执行排序,然后替换所有元素都回来了。
如果您对每次比较期间阵列的确切状态感到好奇 - 请记录下来!
const arr = [5, 2, 3, 1, 4];
arr.sort((a, b) => {
console.log(arr.join(' '));
return a - b;
});

在Firefox 60中,它始终记录数组的原始状态;在Chrome 64中,它记录了几种状态,其中一些状态具有原始数组不包含的重复元素。