Stack Overflow на русском Asked on January 6, 2022
Есть объект
object = {
"knot": [
{
"ico": "Папка",
"name": "Архив",
"type": "Папка",
"adress": "0-1",
"сhild": []
},
{
"ico": "Папка",
"name": "Всякое",
"type": "Папка",
"adress": "0-2",
"сhild": []
}
]
}
С сервера мы получаем еще один объект
сhild1 = {
"ico": "rar",
"name": "Архив2",
"type": "Фаил",
"adress": "0-1-1",
"сhild": []
}
Убирая последнюю цифру и -,из adress у пришедшего объекта, мы получаем адрес родителя.Куда данный узел должен встать.В объекте object
Так мы можем получить неограниченное количества объектов с разными значениями adress
сhild2 = {
"ico": "rar",
"name": "Архив3",
"type": "Фаил",
"adress": "0-1-2",
"сhild": []
}
Если структура дерева заранее известна, то мы можем обращаться к ней
object.knot[0].сhild[0]=сhild1;
object.knot[0].сhild[1]=сhild2;
И тем самым вставлять узлы в нужные места.
Но если дерево постоянно может расширяться,то вставки тоже могут быть динамическими и иметь подобный вид.
object.knot[0].сhild[1].сhild[0].сhild[1].сhild[0].сhild[0].сhild[0].сhild[0]=сhild2;
Можно конечно написать функцию, которая будет строить такую ленту в строковом представлении, а потом через eval её выполнять,
Но наверное есть же, какое то более красивое решение дописывать, в объект значения,на глубокой вложенности.
Благодаря подсказки Grundy задача решилась.
var object1 = {
"knot": [{
"ico": "Папка",
"name": "Архив",
"type": "Папка",
"adress": "0-1",
"сhild": [{
"ico": "Папка",
"name": "Всякое",
"type": "Папка",
"adress": "0-1-1",
"сhild": []
},
{
"ico": "Папка",
"name": "Всякое",
"type": "Папка",
"adress": "0-1-2",
"сhild": []
}]
},
{
"ico": "Папка",
"name": "Всякое",
"type": "Папка",
"adress": "0-2",
"сhild": []
}
]
};
var сhild2 = {
"ico": "rar",
"name": "Архив3",
"type": "Фаил",
"adress": "0-1-2-1",
"сhild": []
}
var сhild1 = {
"ico": "rar",
"name": "Архив3",
"type": "Фаил",
"adress": "0-1-1-1",
"сhild": []
}
function add_node(mostly_tree, сhild) {
//разбиваем адрес "0-1-1-1" в массив [0][1][1][1]
let calculation = сhild.adress.split('-');
//убираем последнее значение из массива [0][1][1]
calculation.pop();
//собираем из массива [0][1][1] новый адрес "0-1-1"
let parent_adress = calculation.join('-');
//перебираем массив рекурсивно
mostly_tree.map((n) => {
//нашли нужный адресс в дереве вставляем сhild
if (n.adress == parent_adress) {
n.сhild.push(сhild);
}
//если есть сhild и вних что то есть продолжаем перебор
if (n.сhild && n.сhild.length) {
add_node(n.сhild, сhild)
}
}
)
}
add_node(object1.knot, сhild1)
add_node(object1.knot, сhild2)
console.log(object1);
Answered by Андрей Солуянов on January 6, 2022
если строка адреса точно совпадает со структурой, то
Например:
var object = {
"knot": [{
"ico": "Папка",
"name": "Архив",
"type": "Папка",
"adress": "0-1",
"сhild": []
},
{
"ico": "Папка",
"name": "Всякое",
"type": "Папка",
"adress": "0-2",
"сhild": []
}
]
};
var сhild2 = {
"ico": "rar",
"name": "Архив3",
"type": "Фаил",
"adress": "0-1-2",
"сhild": []
}
function findObj(root, path) {
return path.split('-').slice(1, -1).reduce((acc, cur) => acc[cur - 1], root);
}
var obj = findObj(object.knot, сhild2.adress);
console.log(obj)
obj.сhild.push(сhild2);
console.log(object);
Answered by Grundy on January 6, 2022
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP