[英]Get count from Array of arrays
我在下面有一个 arrays 的数组。 使用 ES6,如何将每个值Good
、 Excellent
和Wow
的计数放入新数组中,例如[{name: Good, count: 4} {name: Excellent, count: 5}, {name:Wow, count:2}]
动态风格。 我正在尝试使用Object.assign
但我无法“唯一”地计算出键的计数,相反,我需要使用一个数组,因为我试图在前端呈现它。 我需要使用reduce
吗? 如何?
let k = 0 const stats = {} const remarks = [ [{name: "Good"}], [{name: "Good"}, {name: "Excellent"}], [{name: "Good"}, {name: "Excellent"}, {name: "Wow"}], [{name: "Good"}, {name: "Excellent"}, {name: "Wow"}], [{name: "Excellent"}], [{name: "Excellent"}] ] remarks.forEach((arr) => { arr.map((e) => { Object.assign(stats, { [e.name]: k = k + 1 }) }) }) console.log(stats);
Output:
stats: {Good: 8, Excellent: 11, Wow: 9}
这是不正确的,而且我需要使用数组。
预计 output:
[{name: Good, count: 4} {name: Excellent, count: 5}, {name:Wow, count:2}]
展平数组数组并从以下对象开始减少它: { Good: 0, Excellent: 0, Wow: 0}
然后.map
结果的Object.entries
将其转换为数组:
const remarks = [ [{ name: "Good" }], [{ name: "Good" }, { name: "Excellent" }], [{ name: "Good" }, { name: "Excellent" }, { name: "Wow" }], [{ name: "Good" }, { name: "Excellent" }, { name: "Wow" }], [{ name: "Excellent" }], [{ name: "Excellent" }] ]; const result = Object.entries( remarks.flat().reduce( (all, { name }) => { all[name] += 1; return all; }, { Good: 0, Excellent: 0, Wow: 0 } ) ).map(([name, count]) => ({ name, count })); console.log(result);
您可以尝试以下逻辑:
var data = [[{name: "Good"}],[{name: "Good"}, {name:"Excellent"}],[{name: "Good"}, {name:"Excellent"}, {name:"Wow"}],[{name: "Good"}, {name:"Excellent"}, {name:"Wow"}],[{name:"Excellent"}],[{name:"Excellent"}]] var nData = []; (data || []).forEach( e => { (e || []).forEach(ei => { var i = (index = nData.findIndex(d => d.name === ei.name)) >=0 ? index : nData.length; nData[i] = { name: ei.name, count : (nData[i] && nData[i].count ? nData[i].count : 0)+1 } }); }); console.log(nData);
希望这可以帮助!
您可以使用reduce,然后将结果转换为对象数组:
const counts = remarks.reduce((result, list) => {
list.forEach(remark => {
result[remark.name] = (result[remark.name] || 0) + 1;
});
}, {});
const finalResult = [];
for (let name in counts) {
finalResult.push({name, count: counts[name]});
}
您可以通过以下方式轻松实现:
1)将嵌套数组展平为1个单级数组。
2)迭代平面数组并使用Array.prototype.reduce
创建“计数图”
例如:
const remarks = [ [{ name: 'Good' }], [{ name: 'Good' }, { name: 'Excellent' }], [{ name: 'Good' }, { name: 'Excellent' }, { name: 'Wow' }], [{ name: 'Good' }, { name: 'Excellent' }, { name: 'Wow' }], [{ name: 'Excellent' }], [{ name: 'Excellent' }] ] const flatten = arr => arr.reduce((accum, el) => accum.concat(el), []) const map = flatten(remarks).reduce((accum, el) => { if (accum[el.name]) { accum[el.name] += 1; } else { accum[el.name] = 1; } return accum; }, {}); console.log(map)
首先使用reduce
查找计数,然后reduce
其传递给另一个函数以获得所需的视图结构:
const Good = 1, Excellent = 2, Wow = 3; const remarks = [ [{name: Good}], [{name: Good}, {name:Excellent}], [{name: Good}, {name:Excellent}, {name:Wow}], [{name: Good}, {name:Excellent}, {name:Wow}], [{name:Excellent}], [{name:Excellent}] ]; /* [{name: Good, count: 4} {name: Excellent, count: 5}, {name:Wow, count:2}] */ function counts(remarks) { return remarks.flat().reduce((acc, v) => { const name = v.name; let count = acc[name] || 0; return { ...acc, [name]: count + 1 } }, {}); } function view(counts) { return Object.keys(counts).map(key => { let count = counts[key]; return { name: key, count }; }) } console.log(view(counts(remarks)));
每当您在JavaScript中创建较小的数据集或转换数据时,reduce应该是您尝试使用的第一种方法。 在这种情况下,您可能希望将其与索引器配对(因此使用索引数组和结果数组进行预加载)。
这可以一次通过而无需事先知道名称值。
const remarks = [ [{name: "Good"}], [{name: "Good"}, {name: "Excellent"}], [{name: "Good"}, {name: "Excellent"}, {name: "Wow"}], [{name: "Good"}, {name: "Excellent"}, {name: "Wow"}], [{name: "Excellent"}], [{name: "Excellent"}] ]; const stats = remarks.reduce((p,c) => ( c.forEach( ({name}) => { if(!p[0].hasOwnProperty(name)){ p[1].push({name:name,count:0}); p[0][name] = p[1].length - 1; } p[1][p[0][name]].count++; }),p),[{},[]])[1]; console.log(stats);
一个稍微简洁,绝对不太可读的方法(但值得一提)可能是:
const remarks = [
[{ name: "Good" }],
[{ name: "Good" }, { name: "Excellent" }],
[{ name: "Good" }, { name: "Excellent" }, { name: "Wow" }],
[{ name: "Good" }, { name: "Excellent" }, { name: "Wow" }],
[{ name: "Excellent" }],
[{ name: "Excellent" }]
];
const stats = Object.entries(
remarks
.flat()
.reduce((acc, {name}) => (acc[name] = -~acc[name], acc), {})))
).map(([name, count]) => ({ name, count }));
console.log(stats);
const flattenedRemarks = _.flatten(remarks);
const groupedRemarks = _.groupBy(flattenedRemarks, (remark) => remark.name);
const remarkCounts = _.mapValues(groupedRemarks, (group) => group.length);
const data = {
"mchale": {
"classes":["ESJ030", "SCI339"], // get the length
"faculty":["Hardy", "Vikrum"] // get the length
},
"lawerence":{
"classes":["ENG001"], // get the length
"faculty":["Speedman", "Lee", "Lazenhower"] // get the length
}
};
const count = Object.keys(data).map(campusName => {
const campus = data[campusName];
return Object.keys(campus).map(key => campus[key].length).reduce((p, c) => p + c, 0);
}).reduce((p, c) => p + c, 0);
console.log(count);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.