繁体   English   中英

根据 id 合并对象数组

[英]Merge Object array based on id

嗨,我正在调用一个 API,它返回一个包含问题和答案的对象,如下所示

{
   "questions":[
      {
         "id":1,
         "questionHeader":"Some question header",
         "questionText":"Some question text?",
      },
      {
         "id":2,
         "questionHeader":"Some question header",
         "questionText":"Some question text?",
      },
   ],
   "answers":[
      {
         "id":1,
         "questionId":1,
         "answer":"Some answer",
      },
      {
         "id":2,
         "questionId":1,
         "answer":"Some answer",
      },
      {
         "id":3,
         "questionId":2,
         "answer":"Some answer",
      },
   ]
}

我想要实现的是根据问题 id 和答案 questionId 将答案嵌入到他们各自的问题中。 因此,对于上述内容,我正在尝试实现以下目标。

{
   "questions":[
      {
         "id":1,
         "questionHeader":"Some question header",
         "questionText":"Some question text?",
         "answers":[
          {
             "id":1,
             "questionId":1,
             "answer":"Some answer",
          },
          {
             "id":2,
             "questionId":1,
             "answer":"Some answer",
          },
        ]
      },
      {
         "id":2,
         "questionHeader":"Some question header",
         "questionText":"Some question text?",
         "answers":[
          {
            "id":3,
            "questionId":2,
            "answer":"Some answer",
          },
        ]
      },
   ],
}

我有一些东西可以添加一些答案,但不是每个问题的对象数组。 目前我有这个

const newItem = data.questions.map((t1) => ({
    ...t1,
    ...data.answers.find((t2) => t2.questionId === t1.id),
}));
console.log(newItem);

我已经建立了一个JSFiddle 我怎样才能达到我想要的输出?

谢谢

首先按 ID 索引问题,然后遍历答案。 问题 ID 将使访问相关问题变得容易 - 只需使用括号符号在索引对象上查找它,您就可以推送到该问题的答案。 迭代完成后,再次将问题转回数组。

 const data={questions:[{id:1,questionHeader:"Some question header",questionText:"Some question text?"},{id:2,questionHeader:"Some question header",questionText:"Some question text?"}],answers:[{id:1,questionId:1,answer:"Some answer"},{id:2,questionId:1,answer:"Some answer"},{id:3,questionId:2,answer:"Some answer"}]}; const questionsById = Object.fromEntries( data.questions.map(question => [question.id, { ...question, answers: [] }]) ); for (const answer of data.answers) { questionsById[answer.questionId].answers.push(answer); } const output = Object.values(questionsById); console.log(output);

上面是O(n)因为没有嵌套循环。 如果您想调整嵌套循环方法( O(n ^ 2) )以使其正常工作。 .filter而不是.find这样您就可以获得答案数组,并在对象中的属性前面加上answers:而不是传播。

 const data={questions:[{id:1,questionHeader:"Some question header",questionText:"Some question text?"},{id:2,questionHeader:"Some question header",questionText:"Some question text?"}],answers:[{id:1,questionId:1,answer:"Some answer"},{id:2,questionId:1,answer:"Some answer"},{id:3,questionId:2,answer:"Some answer"}]}; const newItem = data.questions.map((t1) => ({ ...t1, answers: data.answers.filter((t2) => t2.questionId === t1.id), })); console.log(newItem);

Array#filter可用于查找具有特定问题 ID 的所有答案。 (注意Array#find只返回匹配条件的第一个元素。)

 const data={questions:[{id:1,questionHeader:"Some question header",questionText:"Some question text?"},{id:2,questionHeader:"Some question header",questionText:"Some question text?"},],answers:[{id:1,questionId:1,answer:"Some answer"},{id:2,questionId:1,answer:"Some answer"},{id:3,questionId:2,answer:"Some answer"},]}; const newItem = data.questions.map((t1) => ({ ...t1, answers: data.answers.filter((t2) => t2.questionId === t1.id), })); console.log(newItem);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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