在Javascript中,我试图采取数字值的初始数组,并计算其中的元素。理想情况下,结果将是两个新数组,第一个数组指定每个唯一元素,第二个数组包含每个元素出现的次数。但是,我愿意听取关于输出格式的建议。
例如,如果初始数组是:
5, 5, 5, 2, 2, 2, 2, 2, 9, 4
然后将创建两个新数组。第一个将包含每个唯一元素的名称:
5, 2, 9, 4
第二个将包含该元素在初始数组中出现的次数:
3, 5, 1, 1
因为数字5在初始数组中出现了三次,数字2出现了五次,9和4都出现了一次。
我一直在寻找解决方案,但似乎没有一个可行,而且我自己尝试过的每件事最后都出奇地复杂。任何帮助都将不胜感激!
谢谢:)
我知道这个问题是旧的,但我意识到有太少的解决方案,你得到的计数数组要求用最小的代码,所以这是我的
// The initial array we want to count occurences
var initial = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
// The count array asked for
var count = Array.from(new Set(initial)).map(val => initial.filter(v => v === val).length);
// Outputs [ 3, 5, 1, 1 ]
你可以从初始数组中得到集合
var set = Array.from(new Set(initial));
//set = [5, 2, 9, 4]
Const arr = [2,2,5,2,2,2,4,5,5,9];
函数foo(数组){
Let a = [],
B = [],
Arr =…, //克隆数组,这样我们在使用.sort()时不会改变原始数组
prev;
arr.sort ();
For (let元素的arr) {
If (element !== prev) {
a.push(元素);
b.push (1);
}
+ + b (b。长度- 1];
Prev =元素;
}
返回[a, b];
}
Const result = foo(arr);
console.log('(' +结果[0 ] + ']','[' + 结果[1]+ ')')
console.log (arr)
不要使用两个数组的结果,使用一个对象:
a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
result = { };
for(var i = 0; i < a.length; ++i) {
if(!result[a[i]])
result[a[i]] = 0;
++result[a[i]];
}
然后结果将看起来像:
{
2: 5,
4: 1,
5: 3,
9: 1
}
Const occurrence =[5,5,5,2,2,2,2,2,2,2,2,2,2,9,4]。Reduce(函数(acc, curr) {
返回acc[curr] ?++acc[curr]: acc[curr] = 1, acc
}, {});
Console.log (occurrences) // => {2: 5,4: 1,5: 3,9: 1}
ES6版本应该更简单(另一个一行解决方案)
let arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
let acc = arr.reduce((acc, val) => acc.set(val, 1 + (acc.get(val) || 0)), new Map());
console.log(acc);
// output: Map { 5 => 3, 2 => 5, 9 => 1, 4 => 1 }
Map代替普通对象帮助我们区分不同类型的元素,否则所有计数都是基于字符串
使用Lodash
Const值= [5,5,5,2,2,2,2,2,2,2,2,2,9,4];
const frequency = _.map(_.groupBy(values), val =>({值:val[0],频率:val.length}));
console.log(频率);
< script src = " https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js " > < /脚本>