javascript - Extrahera en egenskap inuti en array av objekt som ligger inuti en annan array av objekt och ha resultatet som en array av strängar
Jag har en TypeScript-array med objekt som har följande struktur:
const surveyResponses: any[] = [
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Bla'}]},
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Blo'}]}
];
Jag skulle vilja extrahera response-egenskapen inuti responses-arrayen och ha dem som en enda array av strängar.
Förväntat resultat: ['Bla', 'Blo']
Jag har försökt följa dessa råd:
- Från en array av objekt, extrahera värdet av en egenskap som en array
- Returnerar endast vissa egenskaper från en array av objekt i Javascript
Jag har försökt använda reduce utan framgång:
responses.reduce((a, o) => (o.responses.map(r => r.response) && a.push(o.responses.map(r => r.response)), a), []);
Jag har försökt använda map utan framgång:
responses.map(r => r.responses).map(r => r.map(r => r.response));
Result: [["Bla"], ["Blo"]]
All hjälp skulle uppskattas.
Svar #1
Använd flatMap för att ta responses-arrayen, ta deras response-strängar och kombinera dem:
const surveyResponses = [
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Bla'}]},
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Blo'}]}
];
const result = surveyResponses.flatMap(
item => item.responses.map(
({ response }) => response
)
);
console.log(result);Observera också att att använda any motverkar hela poängen med att använda TypeScript, eftersom det effektivt inaktiverar typkontrollen för det uttrycket. När det är möjligt, låt antingen TS automatiskt härleda typen av ett uttryck, eller ange typen själv manuellt när du behöver. (I det här fallet kan TS automatiskt härleda typen av surveyResponses utan problem)
Om du inte kan använda flatMap, kan du sprida in i concat:
const surveyResponses = [
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Bla'}]},
{createdAt: new Date(), responses: [{questionId: 'input1', response: 'Blo'}]}
];
const result = [].concat(...surveyResponses.map(
item => item.responses.map(
({ response }) => response
)
));
console.log(result);Svar #2
Enligt min mening, ett ännu enklare alternativ med flatMap. Du kan alltid polyfilla det om det inte är tillgängligt.
const result = surveyResponses.flatMap(r => r.responses).map(r => r.response)
console.log(result)
