TransWikia.com

Как динамически дополнять объект ,с n уровнями вложенности.?

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 её выполнять,
Но наверное есть же, какое то более красивое решение дописывать, в объект значения,на глубокой вложенности.

2 Answers

Благодаря подсказки 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

если строка адреса точно совпадает со структурой, то

  1. можно разбить ее по разделителю,
  2. в цикле по полученному пути найти нужный объект куда нужно вставить
  3. вставить в нужное вместо.

Например:

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP