javascript 在JS中按数组中的升序值对数组进行排序

mwg9r5ms  于 2023-02-21  发布在  Java
关注(0)|答案(2)|浏览(113)

这是一个有点棘手的情况,但我有一个这样的数组:

const nums = [32, -3, 62, 8, 121, -231, 62, 13];

并且需要将它们替换为相应的升序索引。上面的示例应生成:

[4, 1, 5, 2, 7, 0, 6, 3]

我想出的解决办法是:TSPlayground

const nums = [32, -3, 62, 8, 121, -231, 62, 13];
const numsCopy = nums.map(e => e);

// Basic sorting
for (let i = 0; i < numsCopy.length; i++) {
    for (let j = 0; j < numsCopy.length; j++) {
        if (numsCopy[i] < numsCopy[j]) {
            let t = numsCopy[j];
            numsCopy[j] = numsCopy[i];
            numsCopy[i] = t;
        }
    }
}

for (let i = 0; i < numsCopy.length; i++) {
    let sortedValue = numsCopy[i];

    nums[nums.indexOf(sortedValue)] = i;
}

然而,当我修改nums以包含一个值nums.length > n >= 0时,问题出现了,调用nums.indexOf(...)可能返回一个错误的结果,因为它可能已经排序了一个索引,即使它存在于数组的某个地方。
如果用这些值替换nums,则由于某种原因,-231的索引将为2 ...

const nums = [32, -3, 62, 7, 121, -231, 62, 13, 0];

> [5, 1, 6, 3, 8, 2, 7, 4, 0]

是否有更好的方法来解决这个问题,或者对我的解决方案进行修复?

tvz2xvvm

tvz2xvvm1#

您可以按值对索引进行排序,并创建一个新数组,其中的索引值位于已排序的位置。
为了得到想要的结果,再次调用排序函数,你得到按索引顺序排序的索引。

const
    sort = array => [...array.keys()].sort((a, b) => array[a] - array[b]),
    fn = array => sort(sort(array));

console.log(...fn([32, -3, 62, 8, 121, -231, 62, 13])); // 4 1 5 2 7 0 6 3
console.log(...fn([-1, 3, 1, 0, 2, 9, -2, 7])); // 1 5 3 2 4 7 0 6
b4lqfgs4

b4lqfgs42#

复制数组,对其值排序,获取indexOfnull为排序副本中的值:

const sortIndicesByValue = array => {
  const sorted = [...array].sort((a, b) => a - b);
  return array.map(e => {
    const i = sorted.indexOf(e);
    sorted[i] = null;
    return i;
  })
}

console.log(...sortIndicesByValue([32, -3, 62, 8, 121, -231, 62, 13]));
console.log(...sortIndicesByValue([-1, 3, 0, 0, 2, 9, -2, 7]));

相关问题