[英]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.