JavaScript - 使用 Array.sort() 对数组元素进行排序,而不改变特定元素的位置

3

我有多个数字数组,其中值为-1的元素位于某些位置。必须按升序对数组进行排序,而不改变值为-1的元素的位置。

我无法在sort(function (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;
});

在第一个示例中,代码未正确运行,结果如下所示:[-1,150,160,170,190,-1,-1,180]。在第二个示例中完全无法运行。

我无法创建一个正确的比较函数。你尝试过什么?能否包含你目前尝试过的代码? - undefined
2
我认为你不能这样做,因为这意味着相同的“-1”值在其他元素中具有不同的位置。一个可能的解决方案是获取所有“-1”元素的索引,从数组中删除它们,对数组进行排序,然后重新插入这些值。 - undefined
2
我无法创建一个正确的比较函数 - 你很聪明地意识到了 :-) 对于这个情况,创建一个比较函数是不可能的,因为你并不是在尝试通过一个位置无关的顺序来排序元素。 - undefined
3个回答

3
您可以进行以下操作:

function sortArr(arr) {
  const sortedArr = arr.filter(item => item !== -1).sort((a,b) => a-b);
  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]));


1
我会将负数过滤到另一个数组中进行排序,然后再弹回原始数组。
例如:

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(',')
  );


你的代码根本就不起作用。看看代码片段运行后的结果。 [-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] - undefined
@Artur 很敏锐,教训我要仔细检查我的结果.. :), 已更新!! - undefined

1
这是一种直接使用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
));


一种适用于各种场合的杰作方法。出色的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接