如何快速排序这个数组?

linkstar
  • 712

补充一下问题哈,现在有一个数组arr,指定的顺序是这样的

let arr = ['index', '1', '2' ,'3', '4', '5', 'operate']

现在有一个子数组arr2,比如是:

let arr2 = ['3', 'operate', 'index', '1']

子数组的排序要参照上面的arr的排序,变成这样:

['index', '1','3', 'operate' ]

其中相比较arr而言,子数组arr2会缺失一些项,但顺序依旧要跟arr保持一致。
怎么处理最高效呢?

回复
阅读 1k
3 个回答
✓ 已被采纳
arr2.sort((a, b) => arr.indexOf(a) - arr.indexOf(b))

先把arr变成对象,保存每一项的index:

var arrObj = {}
arr.forEach((item, i) => arrObj[item] = Number(i))

然后排序

arr2.sort((a, b) => arrObj[a] - arrObj[b])

性能会比每次都indexOf更好

let series = ["index", "1", "2", "3", "4", "5", "operate"];
let data = ["3", "operate", "index", "1"];

console.log(series.indexOf("index"));

// series 比较短的情况下,每次都查找一下 index 也不是很花时间
// 为了不影响后面的结果,是做了个副本来排序的(排序操作会改变原数组)
let result = [...data].sort((a, b) => series.indexOf(a) - series.indexOf(b));
console.log(result);

// 如果想节约这个时间,需要对原数据进行一个映射
result = data.map((v) => [v, series.indexOf(v)])
    .sort(([, ai], [, bi]) => ai - bi)
    .map(([v]) => v);
console.log(result);

// 上面这种做法不能修改原数组
// 如果想直接对原数组进行处理,需要转个弯,用映射表来代替 indexOf
// 同样为了不影响后面的测试(如果有),拷贝了一个数组来测试
const copyData = [...data];
const map = Object.fromEntries(series.map((v, i) => [v, i]));
copyData.sort((a, b) => map[a] - map[b]);
console.log(copyData);
console.log(data);
宣传栏