Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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-使用array.Sort()对数组中的元素进行排序,而不更改某些元素的位置_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript-使用array.Sort()对数组中的元素进行排序,而不更改某些元素的位置

Javascript-使用array.Sort()对数组中的元素进行排序,而不更改某些元素的位置,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有多个数值数组,其中值为-1的元素位于某些位置。数组必须按升序排序,而不更改值为-1的元素的位置。 我无法在排序(函数(a,b){})中创建正确的比较函数。 对以下数组进行排序的结果应如下所示: [-1,150,190,170,-1,-1,160,180] result [-1,150,160,170,-1,-1,180,190]. [-1,2,-1,8,-1,4]) result [-1,2,-1,4,-1,8]. [-1,-1,-1,-1,-1]) result [-1,-1,-1,-1,

我有多个数值数组,其中值为-1的元素位于某些位置。数组必须按升序排序,而不更改值为-1的元素的位置。 我无法在
排序(函数(a,b){})
中创建正确的比较函数。 对以下数组进行排序的结果应如下所示:

[-1,150,190,170,-1,-1,160,180] result [-1,150,160,170,-1,-1,180,190].
[-1,2,-1,8,-1,4]) result [-1,2,-1,4,-1,8].
[-1,-1,-1,-1,-1]) result [-1,-1,-1,-1,-1].
[4,2,9,11,2,16]) result [2,2,4,9,11,16].
此代码

return x.sort(function (a,b) {
    if (a==-1) return 0;
    // if (b==-1) return 0;
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
});
返回x.sort(函数(a,b){
如果(a==-1)返回0;
//如果(b==-1)返回0;
如果(ab)返回1;
返回0;
});

在第一个示例中工作不正常,结果如下所示
[-1150160170190,-1,-1180]
。在第二个示例中根本不起作用。

您可以执行以下操作

功能排序器(arr){
const sortedar=arr.filter(项=>item!=-1)。排序((a,b)=>a-b);
设cnt=0;
返回arr.map(项目=>{
如果(项目==-1)返回-1;
else返回分拣机[cnt++];
});
}
日志(sortArr([-1150190170,-1,-1160180]);
log(sortArr([-1,2,-1,8,-1,4]);
log(sortArr([-1,-1,-1,-1]);

日志(sortArr([4,2,9,11,2,16])我要做的是将负数过滤到另一个数组排序中,然后弹出到原始数组中

例如

功能分拣机(arr){
常量nums=arr.filter(
排序((a,b)=>b-a);
对于(设l=0;l=0)arr[l]=nums.pop();
}
返回arr;
}
控制台日志(分拣机)(
[-1,150,190,170,-1,-1,160,180]).
加入(“,”);
控制台日志(分拣机)(
[-1,2,-1,8,-1,4]).
加入(“,”);
控制台日志(分拣机)(
[-1,-1,-1,-1,-1]).
联接(','))
);
控制台日志(分拣机)(
[4,2,9,11,2,16]).
联接(','))

);
这是一种直接使用
排序
的方法,但使用for
长度
和索引对访问进行整形

const
排序=(数组、sortFn、filterFn=\u=>true)=>{
常量索引=[…数组.keys()].filter(i=>filterFn(数组[i]);
新代理(数组{
获得(目标、道具){
if(isFinite(prop))返回目标[指数[prop]];
if(prop=='length')返回index.length;
返回目标[道具];
},
设置(目标、道具、接收器){
目标[指标[项目]]=接收者;
返回true;
}
})
.sort(sortFn);
返回数组;
};    
console.log(…排序)(
[-1, 150, 190, 170, -1, -1, 160, 180],
(a,b)=>a-b,
v=>v!==-1

));
我无法创建正确的比较函数
您尝试了什么?你能包括你目前为止尝试过的代码吗?我认为你不能这样做,因为这意味着相同的
-1
值相对于其他元素有不同的位置。一个可能的解决方案是获取所有
-1
元素的索引,将它们从数组中删除,对数组进行排序,然后重新插入值。“我无法创建正确的比较函数”-您已经很好地认识到:-)不可能为此创建比较函数,由于您没有尝试按位置无关的顺序对元素进行排序,因此您的代码根本不起作用。在代码段运行[-1150190170,-1,-1160180][1,2,-1,8,-1,4][1,-1,-1,-1,-1,-1][4,2,9,11,2,16]后查看结果。Artur发现得很好,教我不要彻底检查我的结果……),更新了!!。А适用于所有可能情况的最佳方法。杰出的