准备报表数据时的功能Javascript映射/减少

准备报表数据时的功能Javascript映射/减少,javascript,report,Javascript,Report,我很难理解如何正确地使用汇总/报告数据,即分组计数。我通常通过使用forEach在数据上循环并构建对象来手动执行此操作,但我觉得链接map和reduce必须是一种更优雅、更实用的方式;我只是想不出如何正确地做到这一点 这就是我的实验带给我的: const articleData = [ {newsSource: "AP", title: "Some article.", category: "World"}, {newsSource: "BBC", title: "Some ar

我很难理解如何正确地使用汇总/报告数据,即分组计数。我通常通过使用forEach在数据上循环并构建对象来手动执行此操作,但我觉得链接map和reduce必须是一种更优雅、更实用的方式;我只是想不出如何正确地做到这一点

这就是我的实验带给我的:

const articleData = [
    {newsSource: "AP", title: "Some article.", category: "World"},
    {newsSource: "BBC", title: "Some article.", category: "Politics"},
    {newsSource: "CBS", title: "Some article.", category: "Sports"},
    {newsSource: "CNN", title: "Some article.", category: "Finance"},
    {newsSource: "CNN", title: "Another article.", category: "Politics"},
    {newsSource: "NBC", title: "Some article.", category: "Politics"},
    {newsSource: "NBC", title: "Another article.", category: "Finance"},
    {newsSource: "Reuters", title: "Some article.", category: "World"},
    {newsSource: "Reuters", title: "Another article.", category: "Politics"},
    {newsSource: "Reuters", title: "Yet another article.", category: "Finance"}
];

// I want to set reportData to be the result of the chained map/reduce
// ...not declare it here and assemble it within the functions below
let reportData = {};

articleData.map((item, index) => {
    if (item.newsSource) return item.newsSource;
})
.reduce((acc, newsSource) => {

    if (!reportData[newsSource]) {
        reportData[newsSource] = 1;
    } else {
        reportData[newsSource] = reportData[newsSource] + 1;
    }

    return (acc, reportData);

});

console.log(reportData);
// Expected output:
// { AP: 1, BBC: 1, CBS: 1, CNN: 2, NBC: 2, Reuters: 3 }
这里有很多问题。最重要的是它跳过了第一个数据元素!我想我明白为什么,但我不知道如何修复它。但最重要的是,我想了解如何构造reduce函数,这样我就不会修改其中的reportData,而是返回预期输出下显示的结构正确的数据

减少平面阵列对我来说是很清楚的,但一旦我处理的是深度超过此范围的结构,我就会感到困惑。

您可以直接在articleData上使用:

请注意,正如@CertainPerformance在他们的评论中指出的那样,您需要传递一个初始值来减少,否则数组中的第一个值将用作初始值,而不包括在迭代中

常量数据=[{ 新闻来源:美联社, 标题:一些文章。, 类别:世界 }, { 新闻来源:BBC, 标题:一些文章。, 类别:政治 }, { 新闻来源:哥伦比亚广播公司, 标题:一些文章。, 类别:体育 }, { 新闻来源:CNN, 标题:一些文章。, 类别:金融 }, { 新闻来源:CNN, 标题:另一篇文章。, 类别:政治 }, { 新闻来源:NBC, 标题:一些文章。, 类别:政治 }, { 新闻来源:NBC, 标题:另一篇文章。, 类别:金融 }, { 新闻来源:路透社, 标题:一些文章。, 类别:世界 }, { 新闻来源:路透社, 标题:另一篇文章。, 类别:政治 }, { 新闻来源:路透社, 标题:又一篇文章。, 类别:金融 } ]; reportData=articleData.reducefunctionc,a{ c[a.newsSource]=c[a.newsSource]| | 0+1; 返回c; }, {}; console.logreportData 您可以直接在articleData上使用:

请注意,正如@CertainPerformance在他们的评论中指出的那样,您需要传递一个初始值来减少,否则数组中的第一个值将用作初始值,而不包括在迭代中

常量数据=[{ 新闻来源:美联社, 标题:一些文章。, 类别:世界 }, { 新闻来源:BBC, 标题:一些文章。, 类别:政治 }, { 新闻来源:哥伦比亚广播公司, 标题:一些文章。, 类别:体育 }, { 新闻来源:CNN, 标题:一些文章。, 类别:金融 }, { 新闻来源:CNN, 标题:另一篇文章。, 类别:政治 }, { 新闻来源:NBC, 标题:一些文章。, 类别:政治 }, { 新闻来源:NBC, 标题:另一篇文章。, 类别:金融 }, { 新闻来源:路透社, 标题:一些文章。, 类别:世界 }, { 新闻来源:路透社, 标题:另一篇文章。, 类别:政治 }, { 新闻来源:路透社, 标题:又一篇文章。, 类别:金融 } ]; reportData=articleData.reducefunctionc,a{ c[a.newsSource]=c[a.newsSource]| | 0+1; 返回c; }, {};
console.logreportData 您可以在reduce方法的第二个参数中传递第一个值累加。您可以在回调函数中跳过值或操纵值

常量数据=[ {新闻来源:美联社,标题:一些文章,类别:世界}, {新闻来源:BBC,标题:一些文章,类别:政治}, {新闻来源:哥伦比亚广播公司,标题:一些文章,类别:体育}, {新闻来源:CNN,标题:一些文章,类别:金融}, {新闻来源:CNN,标题:另一篇文章,类别:政治}, {新闻来源:NBC,标题:一些文章,类别:政治}, {新闻来源:NBC,标题:另一篇文章,类别:金融}, {新闻来源:路透社,标题:一些文章,分类:世界}, {新闻来源:路透社,标题:另一篇文章,类别:政治}, {新闻来源:路透社,标题:另一篇文章,分类:金融} ]; const reportData=articleData.reduceacc,{newsource}=>{ 如果!acc[newsSource]acc[newsSource]=0; acc[newsource]+=1; 返回acc; }, {};
console.logreportData 您可以在reduce方法的第二个参数中传递第一个值累加。您可以在回调函数中跳过值或操纵值

常量数据=[ {新闻来源:美联社,标题:一些文章,类别:世界}, {新闻来源:BBC,标题:一些文章,类别:政治}, {新闻来源:哥伦比亚广播公司,标题:一些文章,类别:体育}, {新闻来源:CNN,标题:一些文章,类别:金融}, {新闻来源:CNN,标题:另一篇文章,类别:政治}, {新闻来源:NBC,标题:一些文章,类别:政治}, {新闻 来源:NBC,标题:另一篇文章,类别:金融}, {新闻来源:路透社,标题:一些文章,分类:世界}, {新闻来源:路透社,标题:另一篇文章,类别:政治}, {新闻来源:路透社,标题:另一篇文章,分类:金融} ]; const reportData=articleData.reduceacc,{newsource}=>{ 如果!acc[newsSource]acc[newsSource]=0; acc[newsource]+=1; 返回acc; }, {};
console.logreportData;您需要传递一个初始值,否则数组的第一个元素将作为初始值而不是迭代。您需要传递一个初始值,否则数组的第一个元素将作为初始值而不是迭代
reportData = articleData.reduce(function(c, a) {
  c[a.newsSource] = (c[a.newsSource] || 0) + 1;
  return c;
}, {});

console.log(reportData);