如何在Javascript中分析/计数对象数组

uurv41yg  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(113)

堆栈溢出!这是我的第一次。
例如,我有一个数组:

[
    {
        "question1": "Apple",
        "question2": 5,
        "question3": "Item 1"
    },
    {
        "question1": "Apple",
        "question2": 4,
        "question3": "Item 2"
    },
    {
        "question1": "Orange",
        "question2": 4,
        "question3": "Item 2"
    }
]

每个对象代表一个响应者对调查中每个问题的回答,这意味着上面的数组总共有3个响应。
我想要的是计算每道题的答案,比如在一道多项选择题中有多少人选择了X答案等等。
对于单个问题,输出如下所示:

[
    {
        "answer": "Apple",
        "count": 2,
    },
    {
        "answer": "Orange",
        "count": 1,
    }
]

这意味着根据上面的例子,我需要总共3个数组(因为总共3个问题)的统计答案。有什么办法可以实现这一点吗?我的目标是在React中使用ChartJS来显示每个问题的回答的图表。
单个图表的最终输出(对于单个问题,例如question 1):

[
    {
        "answer": "Apple",
        "count": 2,
    },
    {
        "answer": "Orange",
        "count": 1,
    }
]
rhfm7lfc

rhfm7lfc1#

这将输出一个对象数组的数组,而不是对象的多个数组变量。由于JavaScript对象保持插入顺序,因此您不必担心问题的顺序不对,假设它们已经处于正确的顺序。

const data = [{question1:"Apple",question2:5,question3:"Item 1"},{question1:"Apple",question2:4,question3:"Item 2"},{question1:"Orange",question2:4,question3:"Item 2"}];

const newData = Object.values(data.reduce((acc, qna) => {
  for (const [question, answer] of Object.entries(qna)) {
    acc[question] = acc[question] ?? {};
    acc[question][answer] = (acc[question][answer] ?? 0) + 1;
  }
  return acc;
}, {}))
  .map((answerCount) => Object.entries(answerCount)
    .map(([answer, count]) => ({ answer, count }))
  );

console.log(newData);

相关问题