Решение Javascript может заключаться в индексации комментариев по идентификатору, итерации по ним и их указании на правильного родителя (с помощью индекса).Наконец, мы можем вернуть корневые узлы (с original_id === null
) из индекса:
const comments = [
{ id: 1, original_id: null, upvotes: 10, text: 'Hi..' },
{ id: 2, original_id: null, upvotes: 0, text: 'Je..' },
{ id: 3, original_id: 1, upvotes: 0, text: 'Di..' },
{ id: 4, original_id: 1, upvotes: 7, text: 'Si..' },
{ id: 5, original_id: 1, upvotes: 5, text: 'Op..' },
{ id: 6, original_id: null, upvotes: 2, text: 'Op..' },
{ id: 7, original_id: 6, upvotes: 2, text: 'Op..' },
{ id: 8, original_id: 5, upvotes: 3, text: 'Op..' },
{ id: 9, original_id: 1, upvotes: 3, text: 'Op..' }
];
let index = comments.reduce((a, c) => {
let comment = Object.assign({}, c);
comment.children = [];
a.set(c.id, comment);
return a;
}, new Map());
Array.from(index.values()).forEach(comment => {
if (comment.original_id) index.get(comment.original_id).children.push(comment)
});
const res = Array.from(index.values()).filter(c => c.original_id === null);
console.log(res);