在Javascript中,我试图采取数字值的初始数组,并计算其中的元素。理想情况下,结果将是两个新数组,第一个数组指定每个唯一元素,第二个数组包含每个元素出现的次数。但是,我愿意听取关于输出格式的建议。
例如,如果初始数组是:
5, 5, 5, 2, 2, 2, 2, 2, 9, 4
然后将创建两个新数组。第一个将包含每个唯一元素的名称:
5, 2, 9, 4
第二个将包含该元素在初始数组中出现的次数:
3, 5, 1, 1
因为数字5在初始数组中出现了三次,数字2出现了五次,9和4都出现了一次。
我一直在寻找解决方案,但似乎没有一个可行,而且我自己尝试过的每件事最后都出奇地复杂。任何帮助都将不胜感激!
谢谢:)
查看下面的代码。
<html>
<head>
<script>
// array with values
var ar = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
var Unique = []; // we'll store a list of unique values in here
var Counts = []; // we'll store the number of occurances in here
for(var i in ar)
{
var Index = ar[i];
Unique[Index] = ar[i];
if(typeof(Counts[Index])=='undefined')
Counts[Index]=1;
else
Counts[Index]++;
}
// remove empty items
Unique = Unique.filter(function(){ return true});
Counts = Counts.filter(function(){ return true});
alert(ar.join(','));
alert(Unique.join(','));
alert(Counts.join(','));
var a=[];
for(var i=0; i<Unique.length; i++)
{
a.push(Unique[i] + ':' + Counts[i] + 'x');
}
alert(a.join(', '));
</script>
</head>
<body>
</body>
</html>
2021年的版本
更优雅的方法是使用逻辑空赋值(x ??= y)结合数组#reduce()与O(n)时间复杂度。
主要思想仍然是使用array# reduce()将输出作为对象进行聚合,以获得最高的性能(时间和空间复杂度),就像其他答案一样,搜索和构造中间数组。
Const arr = [2,2,2,2,2,2,4,5,5,5,9];
Const result = arr。Reduce ((acc, curr) => {
acc(咕咕叫)? ?= {[curr]: 0};
acc[咕咕叫][咕咕叫]+ +;
返回acc;
}, {});
console.log (Object.values(结果));
清理和重构代码
使用逗号操作符(,)语法。
逗号操作符(,)计算它的每个操作数(从左到右)
右)并返回最后一个操作数的值。
Const arr = [2,2,2,2,2,2,4,5,5,5,9];
Const result = arr。减少((acc,咕咕叫)= > (acc[咕咕叫]= (acc(咕咕叫)| | 0)+ 1,acc), {});
console.log(结果);
输出
{
"2": 5,
"4": 1,
"5": 3,
"9": 1
}
使用减法和波浪号(~)操作符的较短版本。
Const data = [2,2,2,2,2,2,4,5,5,5,9];
函数频率(nums) {
num返回。Reduce ((acc, curr) => {
Acc [curr] = -~ Acc [curr];
返回acc;
}, {});
}
console.log(频率(数据));
使用MAP,您可以在输出中有两个数组:一个包含出现次数,另一个包含出现次数。
常量数据集=(2、2、4、2、6、4、7、8、5、6、7、10、10、10、15);
Let values = [];
Let keys = [];
var mapwithoccurs = dataset.reduce((a,c) => {
如果(a.has (c)) a.set (c, a.get (c) + 1);
其他a.set (c, 1);
返回一个;
}, new Map())
.forEach((value, key, map) => {
keys.push(关键);
values.push(价值);
});
console.log(键)
console.log(值)
一行ES6解决方案。这么多的答案使用对象作为地图,但我看不到任何人使用实际的地图
const map = arr.reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map());
使用map.keys()获取唯一元素
使用map.values()来获取事件
使用map.entries()获取对[元素,频率]
Var arr = [5,5,5,2,2,2,2,2,2,2,9,4]
Const map = arr。Reduce ((acc, e) => acc。set(e, (acc.get(e) || 0) + 1), new Map());
console.info([…map.keys ()))
console.info([…map.values ()))
console.info([…]. entry ()))