通过最常见的项目在javascript中排序数组

Jes*_*ess 1 javascript arrays sorting

我有一个字符串数组:

array = ["Henry","Brian","Henry","Matilda","Henry","Brian","Matthew"]
Run Code Online (Sandbox Code Playgroud)

并且想要将它们排序到一个列表中,该列表首先通过最常出现的项目对数组进行排序,但之后也会删除它们以创建如下所示的列表:

sortedArray = ["Henry","Brian","Matilda","Matthew"]
Run Code Online (Sandbox Code Playgroud)

有没有办法在javascript中执行此操作?

tri*_*cot 6

您可以使用此ES6函数,该函数在O(nlogn)中运行,而不是O(n²)作为其他一些解决方案:

var array = ["Henry","Brian","Henry","Matilda","Henry","Brian","Matthew"]

var result = [...array.reduce( (acc, s) => acc.set(s, (acc.get(s) || 0)+1), new Map )]
    .sort( (a, b) => b[1] - a[1] )
    .map( a => a[0] );

console.log(result);
Run Code Online (Sandbox Code Playgroud)

它首先通过保持每个字符串的计数(以线性时间运行)来创建映射.

然后将该映射转换为成对的数组(带扩展[... ]),然后按该计数对其进行排序(O(nlogn)).

最后,使用,从该数组中再次删除计数 .map()

  • 这很酷,但从可维护性的角度来看可能有点不透明.不过,我喜欢它,+ 1. (2认同)