繁体   English   中英

Javascript - 使用 Array.sort() 对数组元素进行排序而不改变某些元素的位置

[英]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的方法,但使用Proxylength和索引进行访问。

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM