Javascript 数组中答案的冗余计数

Javascript 数组中答案的冗余计数,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个这样的对象数组 [ {_id: "5ca8b8ca0f1b2f54646ded9a", question: "Do you like it?", answer: "yes"}, {_id: "5ca8b8ca0f1b2f54646ded99", question: "Do you like it?", answer: "no"}, {_id: "5ca8b8f80f1b2f54646deda1", question: "Where are you?", answer: "home"},

我有一个这样的对象数组

 [
{_id: "5ca8b8ca0f1b2f54646ded9a", question: "Do you like it?", answer: "yes"},
{_id: "5ca8b8ca0f1b2f54646ded99", question: "Do you like it?", answer: "no"},
{_id: "5ca8b8f80f1b2f54646deda1", question: "Where are you?", answer: "home"},
{_id: "5ca8b8f80f1b2f54646deda0", question: "Where are you?", answer: "home"}
]
我想把它复制如下:

[
 {
  "question": "Do you like it?",
  "answers": [{"answer": "yes", "count": 1}, {"answer": "no", "count": 1}]
 },
 {
  "question": "Where are you?",
  "answers": [{"answer": "home", "count": 2}]
 }
]

我曾试图解决这个问题,但我做不到,所以任何帮助都将不胜感激。谢谢您

使用
reduce
创建按问答值分组的对象,然后稍后放弃
使用
Object.values()

const输入=[
{id:“5ca8b8ca0f1b2f54646ded9a”,问题:“你喜欢吗?”,回答:“是”},
{u id:“5ca8b8ca0f1b2f54646ded99”,问题:“你喜欢吗?”,回答:“不”},
{id:“5ca8b8f80f1b2f54646deda1”,问题:“你在哪里?”回答:“家”},
{id:“5ca8b8f80f1b2f54646deda0”,问题:“你在哪里?”回答:“家”}
];
const groupbyquestions和answers=Object.values(input.reduce((accu,{question,answer})=>{
如果(!accu[问题])
accu[question]={question};
如果(!accu[问题][回答])
accu[问题][答案]={答案,计数:0};
累计[问题][答案].计数+=1;
返回accu;
}, {}));
const output=groupbyquestions和answers.map(({question,…res})=>{
返回{问题,答案:Object.values(res)};
});

控制台日志(输出)
我们可以使用
数组。查找
来查找问题-答案对,然后添加新的问题-答案对对象(如果该对不存在),或者更新现有的问题-答案对对象

如果问题存在但答案不存在,则只需将新答案添加到
answers
数组中

如果问题和答案都存在,则将答案
count
属性增加1

如果问题本身缺失,则使用
question
属性和
answers
属性添加一个新对象,并将
count
设置为
1

然后最后使用
Array.reduce
将对象累加到一个数组中

const数据=[
{id:“5ca8b8ca0f1b2f54646ded9a”,问题:“你喜欢吗?”,回答:“是”},
{u id:“5ca8b8ca0f1b2f54646ded99”,问题:“你喜欢吗?”,回答:“不”},
{id:“5ca8b8f80f1b2f54646deda1”,问题:“你在哪里?”回答:“家”},
{id:“5ca8b8f80f1b2f54646deda0”,问题:“你在哪里?”回答:“家”}
];
const res=data.reduce((acc,{问题,答案})=>{
qFound=acc.find(qa=>qa.question==question);
如果(qFound){
ansFound=qFound.answers.find(ans=>ans.answer==answer);
如果(发现){
ansFound.count=ansFound.count+1;
}否则{
qFound.answers.push({answer,count:1});
}
}否则{
加速推({
问题:,
答案:[].concat({答案,计数:1})
});
}
返回acc;
},[]);
控制台日志(res);