繁体   English   中英

从 arrays 的数组中获取计数

[英]Get count from Array of arrays

我在下面有一个 arrays 的数组。 使用 ES6,如何将每个值GoodExcellentWow的计数放入新数组中,例如[{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);

它使用reducer中的逗号运算符返回累加器; 并且按位运算符不创建计数器而不需要使用所有名称预先初始化对象。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM