首页 > 解决方案 > 如何在保留顺序的同时对数组进行排序

问题描述

我有一个数组,例如 3,4,3,1,5

按升序或降序排序给出 1,3,3,4,5 或 5,4,3,3,1。

我需要原始订单,例如 3,3,4,1,5

underscoreJs 有 groupBy 方法,但是它将数组分成组。

有任何想法吗?

标签: javascriptsortingunderscore.js

解决方案


如果要对数组进行就地排序,可以sort使用优先级对象获取每个项目的优先级

let array = [3, 4, 3, 1, 5],
    index = 0,
    priority = {};
      
array.forEach(n => priority[n] = priority[n] || ++index);
array.sort((a, b) => priority[a] - priority[b])

console.log(array)

如果你想要一个新数组,你可以创建一个counter计算出现次数的对象。然后,根据每个数字的计数创建另一个数组

const 
    array = [3, 4, 3, 1, 5],
    counter = array.reduce((acc, n) => acc.set(n, acc.get(n) + 1 || 1), new Map),
    output = Array.from(counter).flatMap(([n, count]) => Array(count).fill(n))

console.log(output)


推荐阅读