这个问题在这里已有答案:
让我说我有一个像这样的数组:
let votesArr = [yes,no,yes,no,yes];
我想计算每个单词重复多少次并推送到另一个单词,所以输出看起来像这样:
let votesData = [3,2]; // 3 for three yeses and 2 for two nos.
我想要处理这样的许多类型的数组,让我们说一个有3或4个唯一字的数组。我已经尝试了很多时间而且不能这样做。
你可以使用Map
的力量。
var array = ['yes', 'no', 'yes', 'no', 'yes'],
map = new Map,
result;
array.forEach(v => map.set(v, (map.get(v) || 0) + 1));
result = [...map.values()];
console.log(result);
只是返回一个简单的计数数组我猜是没有意义的。它应该更像下面。如果您不想要此输出,则只需映射值以形成数组。
{
"yes": 3,
"no": 2
}
let votesArr = ["yes","no","yes","no","yes"];
const mappedArr = votesArr.reduce((a, b) => {
a[b] = a[b] || 0;
a[b] += 1;
return a;
}, {});
console.log(mappedArr);
你可以这样做:
let votesArr = ["yes","no","yes","no","yes"];
let countSummary = votesArr.reduce( (count, val) => {
if(!count[val]) { count[val] = 0 }
count[val]++;
return count;
}, {})
console.log(countSummary)// {yes: 3, no: 2}
let countSummmaryArr = Object.keys(countSummary).map(k=>countSummary[k]);
console.log(countSummmaryArr )// [3,2]
这种方法的工作方式是.reduce
将每个实例计算为值的映射,并且.map
将其转换为值的数组。
下面做你需要的,虽然我确定它可以清理一下。
var data = ["Unsure", "Yes", "Yes", "No", "Yes", "No", "Maybe", "Unsure"];
var counts = {};
for (var i = 0; i < data.length; i++) {
(counts[data[i]]) ? counts[data[i]]++ : counts[data[i]] = 1;
}
// counts = {Unsure: 2, Yes: 3, No: 2, Maybe: 1}
你可以这样做
let votesArr = ['yes', 'no', 'yes', 'no', 'yes'];
// Create an empty object to store array item as key & its
// number of repeat as value
var itemObj = {};
// loop over it and store the value in the object
var m = votesArr.forEach(function(item) {
if (!itemObj[item]) {
itemObj[item] = 1
} else {
itemObj[item] = itemObj[item] + 1
}
});
// Use object.values to retrive the value
console.log(Object.values(itemObj))