How to map an array of objects in to a different one based on criteria?
How to convert the following array of questions in to expected array?
const questions = [
{ type: 'question', index: 1 },
{ type: 'question', index: 2 },
{ type: 'answer', index: 3 },
{ type: 'answer', index: 4 },
{ type: 'answer', index: 5 },
{ type: 'answer', index: 6 },
{ type: 'answer', index: 7 },
{ type: 'answer', index: 8 },
{ type: 'answer', index: 9 },
{ type: 'question', index: 11 },
{ type: 'answer', index: 12 },
{ type: 'answer', index: 13 },
{ type: 'question', index: 14 },
{ type: 'question', index: 15 },
{ type: 'question', index: 16 },
{ type: 'question', index: 17 },
{ type: 'answer', index: 18 },
{ type: 'answer', index: 19 },
{ type: 'question', index: 20 },
{ type: 'question', index: 21 },
{ type: 'question', index: 22 },
{ type: 'question', index: 23 },
{ type: 'question', index: 24 },
{ type: 'question', index: 25 },
{ type: 'question', index: 26 },
{ type: 'question', index: 27 },
{ type: 'question', index: 28 },
{ type: 'question', index: 100 },
{}
];
This is the expected array of results.
const expected = [
{ type: "question", index: 1, answers: [] },
{
type: "question",
index: 2,
answers: [
{ type: "answer", index: 3 },
{ type: "answer", index: 4 },
{ type: "answer", index: 5 },
{ type: "answer", index: 6 },
{ type: "answer", index: 7 },
{ type: "answer", index: 8 },
{ type: "answer", index: 9 },
],
},
{
type: "question",
index: 11,
answers: [
{ type: "answer", index: 12 },
{ type: "answer", index: 13 },
],
},
{ type: "question", index: 14, answers: [] },
{ type: "question", index: 15, answers: [] },
{ type: "question", index: 16, answers: [] },
{
type: "question",
index: 17,
answers: [
{ type: "answer", index: 18 },
{ type: "answer", index: 19 },
],
},
{ type: "question", index: 20, answers: []},
{ type: "question", index: 21, answers: []},
{ type: "question", index: 22, answers: []},
{ type: "question", index: 23, answers: []},
{ type: "question", index: 24, answers: []},
{ type: "question", index: 25, answers: []},
{ type: "question", index: 26, answers: []},
{ type: "question", index: 27, answers: []},
{ type: "question", index: 28, answers: []},
{ type: 'question', index: 100, answers: [] },
{}
];
So the idea is to have a sub array called answers
in to which we push the in-between items with type === 'answer'
.
So the answers should be pushed to the index n-1
with type === 'question'
till the next item with type type === 'question'
is encountered. If there are no answers in-between then keep the array empty.
Basicallly we look for the index and type
Update
So the way I tried was I created an array containing the indices. And each time I looped through I looked for the next maximum index and it’s type. Later based on that I tried copying the in-between indices to the previous index.
Advertisement
Answer
Just imagine how you would filter it as a person and then use the same way for the code.
- You would definitely check all the elements in that array, so you need to use a loop, and then just filter and push it into the new ‘expected’array.
This is how I would do it.
const questions = [
{ type: 'question', index: 1 },
{ type: 'question', index: 2 },
{ type: 'answer', index: 3 },
{ type: 'answer', index: 4 },
{ type: 'answer', index: 5 },
{ type: 'answer', index: 6 },
{ type: 'answer', index: 7 },
{ type: 'answer', index: 8 },
{ type: 'answer', index: 9 },
{ type: 'question', index: 11 },
{ type: 'answer', index: 12 },
{ type: 'answer', index: 13 },
{ type: 'question', index: 14 },
{ type: 'question', index: 15 },
{ type: 'question', index: 16 },
{ type: 'question', index: 17 },
{ type: 'answer', index: 18 },
{ type: 'answer', index: 19 },
{ type: 'question', index: 20 },
{ type: 'question', index: 21 },
{ type: 'question', index: 22 },
{ type: 'question', index: 23 },
{ type: 'question', index: 24 },
{ type: 'question', index: 25 },
{ type: 'question', index: 26 },
{ type: 'question', index: 27 },
{ type: 'question', index: 28 },
{ type: 'question', index: 100 }
];
//filtering array expected
let expected = [];
for (let i of questions){
if (i.type === "question"){
expected.push({
type: i.type,
index: i.index,
answers: []
})
} else if (i.type === 'answer'){
let index = expected.length - 1;
expected[index].answers.push(i)
}
}
console.log(expected);