计算JavaScript数组元素的出现次数并放入新的2d数组

Jor*_*ini 3 javascript arrays

嗨,我有这样的阵列

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
Run Code Online (Sandbox Code Playgroud)

我的目标是计算唯一值并报告其中的任何项目,结果很好

Array [
   [5, 3],
   [2, 5],
   [9, 1],
   [4, 1]
]
Run Code Online (Sandbox Code Playgroud)

我找到了一个解决方案,可以在另一篇文章中找到[ 计算JavaScript数组元素的出现次数

@Emissary解决方案对我来说是最好的,问题是这个解决方案过去并添加一些我不需要的新功能,我不能直接回复该帖子,询问如何只有我需要的数组:d

@Emissary加了

console.log(key +':'+ val)

我的第一个想法是,而不是console.log我可以推送2d数组中的每个值,但我认为这不是一个好主意,因为如果我很了解@Emissary解决方案,那么解决方案的第一部分就是我需要的数组.

知道如何"隔离"这个特定阵列吗?

tri*_*cot 5

这是使用a的理想情况,Map因为它通过键标识,但在转换为它时也会转换为该类型的数组:

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];

var result = [...a.reduce( (m, v) => m.set(v, (m.get(v) || 0) + 1), new Map() )];

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

注意,a.filter在每次迭代时执行的解决方案具有O(n 2)时间复杂度,而这是O(n).您可以使用扩展运算符代替Array.from(a.reduce(....)).

对于旧版浏览器,您可以使用以下变体:

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];

var obj = a.reduce( function (m, v) { return m[v] = (m[v] || 0) + 1, m }, {} ),
    result = [];
for (var key in obj) {
    result.push([+key, obj[key]]);
}
console.log(result);
Run Code Online (Sandbox Code Playgroud)