在Javascript中,我试图采取数字值的初始数组,并计算其中的元素。理想情况下,结果将是两个新数组,第一个数组指定每个唯一元素,第二个数组包含每个元素出现的次数。但是,我愿意听取关于输出格式的建议。
例如,如果初始数组是:
5, 5, 5, 2, 2, 2, 2, 2, 9, 4
然后将创建两个新数组。第一个将包含每个唯一元素的名称:
5, 2, 9, 4
第二个将包含该元素在初始数组中出现的次数:
3, 5, 1, 1
因为数字5在初始数组中出现了三次,数字2出现了五次,9和4都出现了一次。
我一直在寻找解决方案,但似乎没有一个可行,而且我自己尝试过的每件事最后都出奇地复杂。任何帮助都将不胜感激!
谢谢:)
使用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 " > < /脚本>
如果你使用下划线,你可以走功能路线
a = ['foo', 'foo', 'bar'];
var results = _.reduce(a,function(counts,key){ counts[key]++; return counts },
_.object( _.map( _.uniq(a), function(key) { return [key, 0] })))
第一个数组是
_.keys(results)
第二个数组是
_.values(results)
如果本地javascript函数可用,其中大部分将默认为本地javascript函数
演示:http://jsfiddle.net/dAaUU/
我在codewars上解决了一个类似的问题,并设计了以下解决方案。
这将给出数组中整数的最高计数以及整数本身。我认为它也可以应用于字符串数组。
要正确地对字符串排序,请从sort()部分中删除函数(a, b){return a-b}
function mostFrequentItemCount(collection) {
collection.sort(function(a, b){return a-b});
var i=0;
var ans=[];
var int_ans=[];
while(i<collection.length)
{
if(collection[i]===collection[i+1])
{
int_ans.push(collection[i]);
}
else
{
int_ans.push(collection[i]);
ans.push(int_ans);
int_ans=[];
}
i++;
}
var high_count=0;
var high_ans;
i=0;
while(i<ans.length)
{
if(ans[i].length>high_count)
{
high_count=ans[i].length;
high_ans=ans[i][0];
}
i++;
}
return high_ans;
}
使用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 ()))
给定下面提供的数组:
const array = [ 'a', 'b', 'b', 'c', 'c', 'c' ];
你可以使用这个简单的一行代码来生成一个哈希映射,将一个键链接到它在数组中出现的次数:
const hash = Object.fromEntries([ ...array.reduce((map, key) => map.set(key, (map.get(key) || 0) + 1), new Map()) ]);
// { a: 1, b: 2, c: 3 }
扩展和解释:
// first, we use reduce to generate a map with values and the amount of times they appear
const map = array.reduce((map, key) => map.set(key, (map.get(key) || 0) + 1), new Map())
// next, we spread this map into an array
const table = [ ...map ];
// finally, we use Object.fromEntries to generate an object based on this entry table
const result = Object.fromEntries(table);
这个数组归功于@corashina。减少代码