Вам нужно древовидное представление ваших данных, так как ваши данные являются таблицей самоссылки. Итак, вам нужно написать код, который переведет вашу плоскую структуру в дерево. Например, вы можете использовать следующий код для этого:
const makeTree = (array, id, parentId, parentValue) =>
array
.filter(node => {
return node[parentId] === parentValue;
})
.map(node => {
node["items"] = makeTree(array, id, parentId, node[id]);
return node;
});
Где array
- ваш исходный массив, id
- имя поля идентификатора, parentId
- имя поля, содержащего родительский идентификатор, parentValue
- идентификатор корневого узла.
Вы можете вызвать эту функцию следующим образом, чтобы создать дерево из вашего массива:
const tree = makeTree(array, "id", "parent_id", "0");
Где array
- ваш исходный массив:
const array = [
{ id: "5", parent_id: "0", lable: "Movie" },
{ id: "20", parent_id: "5", lable: "Action" },
{ id: "15", parent_id: "43", lable: "J.K Rowling" },
{ id: "43", parent_id: "0", lable: "Book" },
{ id: "2", parent_id: "20", lable: "James Bond Series" },
{ id: "3", parent_id: "0", lable: "Music" },
{ id: "39", parent_id: "15", lable: "Harry Potter Series" }
];
Результирующие элементы массива будут содержать поле items
, которое является массивом дочерних узлов.
После этого вы можете создать рекурсивную функцию, которая будет визуализировать это дерево с помощью jQuery. Например:
const renderLevel = items => {
return $("<ul>").append(
items.map(item =>
$("<li>")
.html(item.lable)
.append(renderLevel(item.items))
)
);
};
Вызовите его и передайте в него переменную tree
:
$(() => {
$("body").append(renderLevel(tree));
});
Это образец .
const array = [
{ id: "5", parent_id: "0", lable: "Movie" },
{ id: "20", parent_id: "5", lable: "Action" },
{ id: "15", parent_id: "43", lable: "J.K Rowling" },
{ id: "43", parent_id: "0", lable: "Book" },
{ id: "2", parent_id: "20", lable: "James Bond Series" },
{ id: "3", parent_id: "0", lable: "Music" },
{ id: "39", parent_id: "15", lable: "Harry Potter Series" }
];
const makeTree = (array, id, parentId, parentValue) =>
array
.filter(node => {
return node[parentId] === parentValue;
})
.map(node => {
node["items"] = makeTree(array, id, parentId, node[id]);
return node;
});
const tree = makeTree(array, "id", "parent_id", "0");
console.log(JSON.stringify(tree))
const renderLevel = items => {
return $("<ul>").append(
items.map(item =>
$("<li>")
.html(item.lable)
.append(renderLevel(item.items))
)
);
};
$(() => {
$("body").append(renderLevel(tree));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>