Як побудувати дерево коментарів з масиву?

Додумався лише до того щоб записувати вкладені коментарі в Dictionary в якому ключі — це ID коментарів, а значення це List відповідей на коментар.

Як на мене це і буде оптимальне рішення для даної задачі.

Спочатку обходимо список коментарів і розділяємо їх на 2 групи:

  1. Список кореневих коментарів (наприклад: rootComments) у яких немає to_comment_id і з яких почнеться дерево
  2. Словник з відповідями (наприклад: childComments) на коментарі де ключ to_comment_id, а значення - це список коментарів зі вказаним to_comment_id

А далі рекурсивно рендеримо дерево коментарів починаючи з кореневих коментарів:

// Псевдокод 
// Обхід кореневих коментарів
<ul>
@for(comment in rootComments)
	// рендеринг віджету з коментарем
@endfor
</ul>

Html віджет коментаря:

<li>тут наш комнетар</li>
@if(childComments.has(comment.id))
	<ul>
		@for(comment in childComments[comment.id])
			// рекурсивний рендеринг віджету з коментарем
		@endfor
	</ul>
@endif
Alex · 8 місяців тому
Коментарі (2)
  1. lawame

    А що робити в цьому випадку:

    <UL>
    <LI>2</LI>
    	
    	<UL>
    		<LI>3</LI>
    		№ 4 та № 13 — відповідь на № 3
    		<UL>
    			<LI>4</LI>
    			<UL>
    				<LI>5</LI>
    				<UL>
    					<LI>6</LI>
    				</UL>
    			</UL>
    		</UL>
    		
    		<UL>
    			<LI>Коментар № 13 є відповіддю на № 3 і має бути на тому ж рівні вкладенності що й коментар № 4.</LI>
    		</UL>
    		
    	</UL>
    </UL>
    
    8 місяців тому ·
    0
    1. Alex

      Так він і буде на тому ж рівні що і 3, але буде після дерева відповідей на 3-й коментар.

      Ось так буде виглядати кінцевий html

      <UL>
      <LI>2</LI>
      	
      	<UL>
      		<LI>3</LI>
      		<UL>
      			<LI>4</LI>
      			<UL>
      				<LI>5</LI>
      				<UL>
      					<LI>6</LI>
      				</UL>
      			</UL>
      		</UL>
      	
      		<LI>Коментар № 13 є відповіддю на № 2 і має бути на тому ж рівні вкладенності що й коментар № 3.</LI>
      		
      	</UL>
      </UL>
      
      8 місяців тому ·
      0
      lawame
Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація