嗨,我有这样的阵列
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解决方案,那么解决方案的第一部分就是我需要的数组.
知道如何"隔离"这个特定阵列吗?
这是使用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)