在JavaScript中一起使用过滤器和排序方法时排序不正确

时间:2018-02-24 18:14:07

标签: javascript arrays sorting

据我所知,我可以通过创建嵌套数组,以更实用的方式对数组进行排序:

                 [ [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]




我认为这里有一个新的概念,我没有理解,因为我似乎无法自己找到解决方案。一如既往,感谢您的耐心和帮助。

1 个答案:

答案 0 :(得分:1)

排序期间数组的状态是实现定义的。每the spec

  
      
  1. 执行依赖于实现的调用序列[[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异常。
    •   
    • 如果从这些操作中返回任何突然完成,则会立即将其作为此函数的值返回。
    •   
  2.   

换句话说,JavaScript引擎的完全有效的排序实现是制作数组的副本,用"hi"替换原始文件中的所有元素,对副本执行排序,然后替换所有元素都回来了。

如果您对每次比较期间阵列的确切状态感到好奇 - 请记录下来!



const arr = [5, 2, 3, 1, 4];

arr.sort((a, b) => {
    console.log(arr.join(' '));
    return a - b;
});




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