Визуализация дерева каталогов с учетом вложенного объекта JSON | Javascript | Реагировать | Интервью Вопрос

Создать данные каталога,
const data = {
name: 'root',
type: 'folder',
children: [
{
name: 'folder1',
type: 'folder',
children: [
{ name: 'file1.txt', type: 'file' },
{ name: 'file2.txt', type: 'file' },
],
},
{
name: 'folder2',
type: 'folder',
children: [
{
name: 'subfolder',
type: 'folder',
children: [{ name: 'file3.txt', type: 'file' }],
},
{ name: 'file4.txt', type: 'file' },
],
},
{ name: 'file5.txt', type: 'file' },
],
};
Создать дерево рендеринга с помощью JSON
Функция renderTree рекурсивно генерирует структуру HTML для дерева каталогов. Он использует неупорядоченный список (<ul>) для представления каждого уровня структуры каталогов и элементов списка (<li>) для папок и файлов.
// HTML --> parentElement
<div id="tree"></div>
function renderTree(data, parentElement) {
const ul = document.createElement('ul');
parentElement.appendChild(ul);
data.forEach((item) => {
const li = document.createElement('li');
const span = document.createElement('span');
span.textContent = item.name;
span.className = item.type;
li.appendChild(span);
ul.appendChild(li);
if (item.children && item.children.length > 0) {
renderTree(item.children, li);
}
});
}
const treeContainer = document.getElementById('tree');
renderTree([data], treeContainer);
Реализация в Javascript,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Directory Tree Renderer</title>
<style>
ul {
list-style-type: none;
margin-left: 20px;
padding: 0;
}
li {
margin-top: 5px;
}
.folder {
color: #0074d9;
}
.file {
color: #2ecc40;
}
</style>
</head>
<body>
<div id="tree"></div>
<script>
const data = {
name: 'root',
type: 'folder',
children: [
{
name: 'folder1',
type: 'folder',
children: [
{ name: 'file1.txt', type: 'file' },
{ name: 'file2.txt', type: 'file' },
],
},
{
name: 'folder2',
type: 'folder',
children: [
{
name: 'subfolder',
type: 'folder',
children: [{ name: 'file3.txt', type: 'file' }],
},
{ name: 'file4.txt', type: 'file' },
],
},
{ name: 'file5.txt', type: 'file' },
],
};
function renderTree(data, parentElement) {
const ul = document.createElement('ul');
parentElement.appendChild(ul);
data.forEach((item) => {
const li = document.createElement('li');
const span = document.createElement('span');
span.textContent = item.name;
span.className = item.type;
li.appendChild(span);
ul.appendChild(li);
if (item.children && item.children.length > 0) {
renderTree(item.children, li);
}
});
}
const treeContainer = document.getElementById('tree');
renderTree([data], treeContainer);
</script>
</body>
</html>
Реализация В React
import React from 'react';
const data = {
name: 'root',
type: 'folder',
children: [
{
name: 'folder1',
type: 'folder',
children: [
{ name: 'file1.txt', type: 'file' },
{ name: 'file2.txt', type: 'file' }
]
},
{
name: 'folder2',
type: 'folder',
children: [
{ name: 'subfolder', type: 'folder', children: [{ name: 'file3.txt', type: 'file' }] },
{ name: 'file4.txt', type: 'file' }
]
},
{ name: 'file5.txt', type: 'file' }
]
};
const TreeNode = ({ node }) => (
<li>
<span className={node.type}>{node.name}</span>
{node.children && node.children.length > 0 && (
<ul>
{node.children.map(child => (
<TreeNode key={child.name} node={child} />
))}
</ul>
)}
</li>
);
const DirectoryTree = () => (
<div>
<ul>
<TreeNode node={data} />
</ul>
</div>
);
export default DirectoryTree;
Спасибо за прочтение
- 👏 Пожалуйста, хлопайте в историю и подписывайтесь на меня 👉
- 📰 Посмотреть больше материалов на тему Javascript, DSA, React, Подготовка к интервью
- 🔔 Подпишитесь на меня: LinkedIn!
Я знаю, что всегда есть что улучшить. Пожалуйста, поделитесь своими мыслями