Javascript 使用Reduce嵌套嵌套对象

Javascript 使用Reduce嵌套嵌套对象,javascript,Javascript,我有一个对象数组,我想使用Reduce将其转换为一个对象: const results = [{ person: "person1", choice: 0, questionId: "a" }, { person: "person1", choice: 1, questionId: "b" }, { ... } ]; 并希望返回具有此预期输出的对象: { results: [ per

我有一个对象数组,我想使用Reduce将其转换为一个对象:

const results = [{
    person: "person1",
    choice: 0,
    questionId: "a"
  },
  {
    person: "person1",
    choice: 1,
    questionId: "b"
  },
  {
    ...
  }
];
并希望返回具有此预期输出的对象:

    {
      results: [
        person1: {
          a: [1, 0, 0, 0],
          b: [0, 1, 0, 0],
          c: [0, 0, 0, 0]
        },
        person2: {
          a: [0, 0, 0, 0],
          b: [0, 0, 1, 0],
          c: [0, 1, 0, 0]
        },
        person3: {
          a: [0, 0, 0, 1],
          b: [0, 0, 0, 0],
          c: [0, 0, 0, 0]
        }
      ]
    }
其中,每个a:[…]表示每个“问题”[a、b、c]的“选择”[0,1,2,3]计数。Person应该是索引,questionId可能是可变的(例如,它可能包括“d”)

我的尝试:

const结果=[{
人物:“person1”,
选择:0,
问题一:“a”
},
{
人物:“person1”,
选择:1,,
问题编号:“b”
},
{
人物:“人物2”,
选择:2,
问题编号:“c”
},
{
人物:“人物2”,
选择:3,
问题编号:“b”
},
{
人物:“person3”,
选择:2,
问题一:“a”
}
]; 
people=[“person1”、“person2”、“person3];
让响应=结果。减少((初始,响应)=>{
开关(响应段){
个案人士[0]:
init[people[0][response.questionId].push(response.choice[0])
打破
个案人士[1]:
init[people[1][response.questionId].push(response.choice[0])
打破
个案人士[2]:
init[people[2][response.questionId].push(response.choice[0]);
打破
违约:
打破
}
返回init;
});

console.log(responses);
假设在您的输出中您指的是
{“person1”:{…},…}
而不是
[“person1”:{…},…]
(后者是一个语法错误),您可以使用reduce进行操作,如下所示:

const结果=[
{person:“person1”,选项:0,问题ID:“a”},
{人:“人1”,选择:1,问题ID:“b”},
{人:“人2”,选择:2,问题ID:“c”},
{人:“人2”,选择:3,问题ID:“b”},
{人:“人3”,选择:2,问题ID:“a”}
]; 
//创建结果数组中找到的所有唯一问号的数组
var questionId=Array.from(新集合(results.map(result=>result.questionId));
console.log(问题ID);
var resultsObj={
结果:results.reduce((res,{person,questionId,choice})=>{
//如果尚未创建人员,请创建他们
如果(!res[人]){
//需要这样做。映射到这里而不是外部,这样我们就可以为每个人获得新的数组引用
res[person]=Object.assign({},…questionIds.map(id=>({[id]:[0,0,0]}));
}
//在给出答案的正确插槽中记录1
res[person][questionId][choice]=1;
返回res;
}, {})
};

console.log(resultsObj)
您能修复预期的对象输出吗?它的对象结构不正确。在发布答案之前,我需要知道您预期的输出是什么样子的。谢谢!@th3n3wguy当然,对此表示歉意!我已经概述了预期的输出并修复了代码中的一个错误。很明显,您希望“personX”字符串“(其中X是一个数字)是与结果关联的数组的索引?@th3n3wguy是的,这就是我要找的,谢谢!我的意思是,在默认情况下,您需要根据问题ID动态设置a、b和c。虽然这个问题还不清楚,但NVM对此非常感谢。如果有可能将questionId设置为动态的,这将是理想的,因为它们不是一个固定的集合,也不是从具有UUIDs@mhodges非常感谢@Maroshii你是对的-我错过了问题中的动态要求。OP清理了它,我编辑了我的帖子,使之充满活力。