是否可以对数组进行排序并仅获得展示位置的返回而不更改顺序

Posted

技术标签:

【中文标题】是否可以对数组进行排序并仅获得展示位置的返回而不更改顺序【英文标题】:is it possible to sort an array and just get the return of the placements NOT change the order 【发布时间】:2021-05-05 02:12:02 【问题描述】:

我有一个数字数组

counter[7,3,9,5,1]

如果我这样做counter.sort(),它会将数组更改为

counter[1,3,5,7,9]

像这样的

sortedArrayByPlacment[3,1,4,2,0];

【问题讨论】:

【参考方案1】:

您可以复制数组,对其进行排序,然后将其转换为对象(以便快速查找)并将原始数组映射到对象上以识别新的索引。

您还需要传递一个比较器函数;没有任何参数的.sort 将按字典顺序排序,例如,11 排在 2 之前,这几乎肯定是不可取的。

const arr = [7,3,9,5,1];
const indexByNum = Object.fromEntries(
  [...arr]
    .sort((a, b) => a - b)
    .map((num, i) => [num, i])
);
const indicies = arr.map(num => indexByNum[num]);
console.log(indicies);

我使用Object.fromEntries 来降低映射的计算复杂性,但如果你愿意,你可以不用它:

const arr = [7,3,9,5,1];
const sorted = [...arr].sort((a, b) => a - b);
const indicies = arr.map(num => sorted.indexOf(num));
console.log(indicies);

PS:这些 sn-ps 仅在数组中的值唯一时才起作用

【讨论】:

以上是关于是否可以对数组进行排序并仅获得展示位置的返回而不更改顺序的主要内容,如果未能解决你的问题,请参考以下文章

随机选择算法

JS对象数组多条件排序

是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?

在 nlog(n) 时间内对整数数组进行排序而不使用比较运算符

如何通过比较字符串出现的位置来对字符串列表进行排序?

在 C++ 中对结构数组进行排序