Задать вопрос
squadbrodyaga
@squadbrodyaga
帆は風を変えた

Как сделать рекурсию для списка комментариев?

Есть вот такой набор комментариев:
{
  id: 1,
  value: "Привет, я первый комментарий"
  parrent_id: null
},
{
  id: 2,
  value: "Привет, я ответ на первый комментарий"
  parrent_id: 1
},
{
  id: 3,
  value: "А я ответ на ответ"
  parrent_id: 2
},
{
  id: 4,
  value: "Я второй комментарий"
  parrent_id: null
}


Как древовидно вывести список этих комментариев, но чтобы глубина дерева была не больше трёх элементов?
  • Вопрос задан
  • 138 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Frontend-разработчик
    9 месяцев
    Далее
  • Loftschool
    Профессия Веб-разработчик
    7 месяцев
    Далее
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Функция, превращающая плоский массив в дерево:

function createTree({
  data,
  key = 'id',
  parentKey = 'parentId',
  childrenKey = 'children',
}) {
  const tree = Object.fromEntries(data.map(n => [
    n[key],
    { ...n, [childrenKey]: [] },
  ]));

  return Object.values(tree).filter(n => (
    !tree[n[parentKey]]?.[childrenKey].push(n)
  ));
}

Рекурсивный компонент v-tree, выводящий древовидные данные:

props: {
  items: {
    type: Array,
    default: () => [],
  },
  maxdepth: {
    type: Number,
    default: Infinity,
  },
},

<ul v-if="Array.isArray(items) && items.length && maxdepth > 0">
  <li v-for="n in items" :key="n.id">
    {{ n.value }}
    <v-tree :items="n.children" :maxdepth="maxdepth - 1" />
  </li>
</ul>

Как использовать:

data: () => ({
  treeData: createTree({
    data: flatData,
    parentKey: 'parent_id',
  }),
}),

// или

computed: {
  treeData() {
    return createTree({
      data: this.flatData,
      parentKey: 'parent_id',
    });
  },
},

<v-tree
  :items="treeData"
  :maxdepth="3"
/>

Демо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы