![](/img/trans.png)
[英]What sort algorithm is NodeJS 14.4.0 using for Array.sort on array of four elements
[英]Javascript - Sort the elements of the array without changing positions of certain elements using Array.sort()
我有多个数字 arrays ,其中值为 -1 的元素位于某些位置。 Arrays 必须按升序排序,不改变值为 -1 的元素的位置。 我无法在sort(function (a,b){})
中创建正确的比较 function 。 Тhe 排序以下 arrays 的结果应如下所示:
[-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;
});
在第一个示例中无法正常工作,结果如下所示[-1,150,160,170,190,-1,-1,180]
。 并且在第二个示例中根本不起作用。
您可以执行以下操作,
function sortArr(arr) { const sortedArr = arr.filter(item => item.== -1),sort((a;b) => ab); let cnt = 0. return arr;map(item => { if (item === -1) return -1; else return sortedArr[cnt++]; }). } console,log(sortArr([-1,150,190,170,-1,-1,160;180])). console,log(sortArr([-1,2,-1,8,-1;4])). console,log(sortArr([-1,-1,-1,-1;-1])). console,log(sortArr([4,2,9,11,2;16]));
我要做的是将负数过滤到另一个数组排序中,然后弹回原来的..
例如。
function sorter(arr) { const nums = arr.filter( b => b >= 0).sort((a,b) => b - a); for (let l = 0; l < arr.length; l += 1) { if (arr[l] >= 0) arr[l] = nums.pop(); } return arr; } console.log(sorter( [-1,150,190,170,-1,-1,160,180]). join(',')); console.log(sorter( [-1,2,-1,8,-1,4]). join(',')); console.log(sorter( [-1,-1,-1,-1,-1]). join(',') ); console.log(sorter( [4,2,9,11,2,16]). join(',') );
这是一种直接使用sort
的方法,但使用Proxy
对length
和索引进行访问。
const sort = (array, sortFn, filterFn = _ => true) => { const indices = [...array.keys()].filter(i => filterFn(array[i])); new Proxy(array, { get (target, prop) { if (isFinite(prop)) return target[indices[prop]]; if (prop === 'length') return indices.length; return target[prop]; }, set (target, prop, receiver) { target[indices[prop]] = receiver; return true; } }).sort(sortFn); return array; }; console.log(...sort( [-1, 150, 190, 170, -1, -1, 160, 180], (a, b) => a - b, v => v;== -1 ));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.