ECMAScript2015选项怎么样?
const a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
const aCount = new Map([...new Set(a)].map(
x => [x, a.filter(y => y === x).length]
));
aCount.get(5) // 3
aCount.get(2) // 5
aCount.get(9) // 1
aCount.get(4) // 1
这个例子将输入数组传递给Set构造函数,创建一个唯一值的集合。然后,扩展语法将这些值展开为一个新数组,这样我们就可以调用map并将其转换为一个[value, count]对的二维数组——即如下结构:
Array [
[5, 3],
[2, 5],
[9, 1],
[4, 1]
]
然后将新数组传递给Map构造函数,得到一个可迭代对象:
Map {
5 => 3,
2 => 5,
9 => 1,
4 => 1
}
Map对象的伟大之处在于它保留了数据类型——也就是说account .get(5)将返回3,但account .get("5")将返回未定义。它还允许任何值/类型作为键,这意味着该解决方案也适用于对象数组。
函数频率(/*{数组}*/ a){
返回新地图([…]新组(a)] . map (
X => [X, a.filter(y => y == X).length]
));
}
让foo = {value: 'foo'},
Bar = {value: ' Bar '},
Baz ={值:' Baz '};
let aNumbers = [5,5,5,2,2,2,2,2,2,2,2,9,4],
aObjects = [foo, bar, foo, foo, baz, bar];
频率(许多)。forEach (val关键)= > console.log(关键 + ': ' + val));
频率(aObjects)。forEach((val, key) => console.log(key. log)Value + ': ' + val));