Задать вопрос
@sasha7b
React, Node.js, UX/UI дизайн.

Дописать функцию для создания дерева ответов?

Разрабатываю фронтенд для самописного форума. Нужно написать функцию, которая будет создавать дерево ответов в постах. Затем это дерево будет рекурсивно рендерить React(это уже сделано).
Типичный пост выглядит так(убрал элементы, не относящиеся к задаче):
{
    id: 2,
    refTo: 1
    comment: 'Комментарий'
}

id - id поста, refTo - id поста, на который отвечает этот пост.

Написал следующую функцию:
const createReplyTree = (replyNode, thread = replyNode) => {
        const tree = replyNode.map(i => {
            const replies = thread.filter(item => item.refTo === i.id);
            return {...i, replies: createReplyTree(replies, thread)};
        });
        return tree;
    };

Частично реализовывает задачу - к постам, на которые кто-то ответил, эти посты рекурсивно добавляет в replies. Но в конце массива остаются дубликаты ответов. Их нужно как-то исключить из массива.
Решение желательно на ES6 и без сторонних библиотек.

У постов может и не быть refTo.
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
Перебор массива с фильтрацией будет работать быстро только при небольшом количестве элементов или при использовании memo или reselect, для гарантии быстроты лучше перевести массив в дерево. Что-то вроде такого.

const toTree = (arr, idAttr = 'id', parentAttr = 'parentId') => {
  arr.sort((a, b) => 
    (a[parentAttr] === b[idAttr] && 1) ||
    (b[parentAttr] === a[idAttr] && -1) ||
    0)

  const tree = arr.reduce((tree, data) => {
    data.children = []
    tree[data[idAttr]] = data;
    (tree[data[parentId]] || tree).children.push(data);
    return tree
  }, { children: [] }).children;

  return tree
}


Получится дерево в виде

[{
    id: 1,
    comment: 'Комментарий',
    children: [{
        id: 2,
        refTo: 1.
        children: ...  
    }, {
        id: 3.
        refTo: 1,
    }]
}, {...}]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 16:42
2000 руб./за проект
18 дек. 2024, в 16:33
2000 руб./в час
18 дек. 2024, в 16:06
5000 руб./за проект