Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中同时使用筛选器和排序方法时排序不正确_Javascript_Arrays_Sorting - Fatal编程技术网

在JavaScript中同时使用筛选器和排序方法时排序不正确

在JavaScript中同时使用筛选器和排序方法时排序不正确,javascript,arrays,sorting,Javascript,Arrays,Sorting,我知道,通过创建嵌套数组,我可以以更实用的方式对数组进行排序: [ [value,frequency], [value,frequency] ] 按频率排序 然而,我试图使用另一种方法,因为它在我的头脑中是有意义的,但由于某些原因,我无法解释为什么它不能始终如一地工作 一些测试返回了这些令人困惑的结果: 函数arrOrd(arr){ var arr_s=arr.sort( 功能(a、b){ var u=arr.filter(x=>x==a).length;

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

                 [ [value,frequency], [value,frequency] ]
按频率排序

然而,我试图使用另一种方法,因为它在我的头脑中是有意义的,但由于某些原因,我无法解释为什么它不能始终如一地工作

一些测试返回了这些令人困惑的结果:

函数arrOrd(arr){
var arr_s=arr.sort(
功能(a、b){
var u=arr.filter(x=>x==a).length;
var v=arr.filter(x=>x==b).length;
返回u-v;
})
返回arr_s;
}
log(arrOrd([2,3,5,3,7,9,5,3,7]).toString());//=>[9,2,7,7,5,5,3,3,3]
log(arrOrd([4,4,2,5,1,1,3,3,2,8]).toString());//=>[8,5,4,4,2,1,1,3,3,2]

log(arrOrd([4,9,5,0,7,3,8,4,9,0]).toString());//=>[8,3,7,5,4,9,0,4,9,0]
排序过程中数组的状态由实现定义。Per:

  • 执行与实现相关的对[[Get]]的调用序列 和[[Set]]obj的内部方法,以删除属性TorThrow和 以obj作为第一个参数的HasOwnProperty抽象操作,以及 排序比较(如下所述),以便:

    • 对[[Get]]、[[Set]]、HasOwnProperty或DeletePropertyTorThrow的每次调用的属性键参数都是字符串表示形式 指小于len的非负整数
    • 调用SortCompare的参数是以前调用[[Get]]内部方法时返回的值,除非属性 根据,以前那些调用访问的不存在 他有自己的财产。如果SortCompare的两个透视[sic]参数 对应于不存在的属性,请使用+0而不是调用 SortCompare。如果只有第一个透视参数不存在 使用+1。如果只有第二个透视参数不存在,则使用 -一,
    • 如果obj不是稀疏的,则不能调用DeletePropertyOrThrow
    • 如果任何[[Set]]调用返回false,将引发TypeError异常
    • 如果从这些操作中的任何一个返回突然完成,它将立即作为此函数的值返回
  • 换句话说,对于JavaScript引擎来说,一个完全有效的排序实现是创建数组的副本,将原始数组中的所有元素替换为
    “hi”
    ,对副本执行排序,然后将所有元素替换回来

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

    const arr=[5,2,3,1,4];
    arr.sort((a,b)=>{
    控制台日志(arr.join(“”));
    返回a-b;
    });