Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jaky napsat script v JS který vygeneruje takový objekt

Ahoj chlapy, stáhl jsem si z webu free API která vykresluje elementy které se získávají z objektu data (viz níže). Problém je v tom, že pokud chci přidat +/- 100 elementů do tohoto objektu i daleko hlouběji vnořených tak to spíš umřu, už je to nepřehledný teď. Neexistuje nějaký pomocník kterým by to šlo lehce vygenerovat z nějakého přehledného formátu? Velmi děkuji za pomoc!


var data = [
            {
                description: "Element ROOT",
                children: [
                    {
                        description: "Element 1",
                        children: [
                            {
                                description: "Element 1.1",
                                children: []
                            },
                            {
                                description: "Element 1.2",
                                children: [
                                    {
                                        description: "Element 1.2.1",
                                        children: []
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        description: "Element 2",
                        children: [
                            {
                                description: "Element 2.1 with tooltip",
                                tooltip: "Hey I'm a tooltip",
                                children: []
                            },
                            {
                                description: "Element 2.2",
                                children: []
                            }
                        ]
                    },
                    {
                        description: "Element 3",
                        children: [
                            {
                                description: "Element 3.1",
                                children: []
                            },
                            {
                                description: "Element 3.2",
                                children: []
                            },
                            {
                                description: "Element 3.3",
                                children: [
                                    {
                                        description: "Element 3.3.1",
                                        children: []
                                    },
                                    {
                                        description: "Element 3.3.2",
                                        children: []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ];
Předmět Autor Datum
Neví, zda ti dobře rozumím. Chceš něco jako textovej soubor s daleko jednodušším zápisem a pak ho př…
Pavel 29.01.2020 16:38
Pavel
Ano ano, přesně tak, tohle je absolutně pro amatéra nepřehledné.
Fr.Buran 29.01.2020 16:41
Fr.Buran
Díky za rady, vidím, že to tu žije...
Fr.Buran 30.01.2020 17:24
Fr.Buran
No a chceš poradit, nebo chceš aby to někdo udělal za tebe?
Wikan 30.01.2020 17:27
Wikan
... a nebo chce třeba jen kritizovat. Kolika lidem tady poradil on?
host 30.01.2020 17:30
host
Vidíš tady snad nějakou radu?
Fr.Buran 30.01.2020 20:47
Fr.Buran
Vidíš tady snad někde záruku, že každý dotaz bude vyřešen?
host 30.01.2020 21:09
host
1. Procházej řádek po řádku. 2. Pokud se odsazení nemění, přidávej prvky do současné kolekce. 3. Pok…
Wikan 30.01.2020 22:08
Wikan
Tak ve finále to stejně vyšlo nastejno.
Fr.Buran 31.01.2020 19:33
Fr.Buran
Aha, takže chceš, aby to za tebe někdo udělal. Pak tomu ale neříkej rada.
Wikan 31.01.2020 19:46
Wikan
Tak ono je to těžký, netuším co je to prvek, současná kolekce, zásobník atd.
Fr.Buran 31.01.2020 23:01
Fr.Buran
Vytvořené narychlo, takže určitě ne ideální: function parse(input) { const result = []; const stack…
Wikan 31.01.2020 20:39
Wikan
Díky moc aspoň za to, tohle bych neudělal ani za týden. To, že to generuje správně jen 4 úrovně je z…
Fr.Buran 31.01.2020 23:04
Fr.Buran
Je fakt že na víc než 4 úrovně jsem to nezkoušel, ale na první pohled nevidím, proč by to nemělo fun…
Wikan 31.01.2020 23:11
Wikan
Tak třeba taková struktura var input = `aaa bbb bbb ccc ccc ddd bbb (tady začíná problém) bbb bbb…
Fr.Buran 31.01.2020 23:28
Fr.Buran
function parse(input) { const result = []; const stack = []; const lines = input.split("\n"); let in…
Wikan 01.02.2020 10:18
Wikan
Velmi moc děkuji za pomoc. Vypadá to, že se to teď generuje správně. Ještě jedna technická, jak můžu…
Fr.Buran 01.02.2020 12:14
Fr.Buran
const json = JSON.stringify(result, null, 2); console.log(json.substr(1, json.length - 2));
Wikan 01.02.2020 12:27
Wikan
Děkuji, výpis funguje super. Je prosím tě rozdíl mezi tím, že vypíšu console.log(json.substr(1, jso…
Fr.Buran 01.02.2020 13:00
Fr.Buran
Pokud to chceš mít v proměnné, tak můžeš použít přímo result a nepřevádět to na string.
Wikan 01.02.2020 16:10
Wikan
Ano pro první případ to funguje jak píšeš, tedy při použití hranatých závorek Našel jsem na webu lep…
Fr.Buran 01.02.2020 16:22
Fr.Buran
To ale bude fungoval jenom s jedním elementem na nejvyšší úrovni.
Wikan 01.02.2020 17:01
Wikan
Nerozumím co tím myslíš.
Fr.Buran 01.02.2020 18:41
Fr.Buran
aaa bbb bbb aaa bbb Tohle nebude fungovat, protože tam jsou dva "aaa" prvky.
Wikan 01.02.2020 20:18
Wikan
To nevadí, tohle funguje root aaa bbb bbb aaa bbb
Fr.Buran 01.02.2020 20:45
Fr.Buran
V tom případě stačí: result[0]
Wikan 01.02.2020 21:57
Wikan
Tebe je tady vážně škoda .... Díky moc. poslední
Fr.Buran 01.02.2020 22:40
Fr.Buran

1. Procházej řádek po řádku.
2. Pokud se odsazení nemění, přidávej prvky do současné kolekce.
3. Pokud se odsazení zvýší, ulož si současnou kolekci do zásobníku a vytvoř novou, do které přidáš současný prvek a případné další se stejným odsazením.
4. Pokud se odsazení sníží, vyjmi kolekci ze zásobníku a ukládej prvky do ní.

Vytvořené narychlo, takže určitě ne ideální:

function parse(input) {
  const result = [];
  const stack = [];
  const lines = input.split("\n");
  let indent = 0;
  let col = result;
  let item;
  for (let i = 0; i < lines.length; i++) {
    const line = lines[i];
    let curInd = 0;
    while (line[curInd] === " ") curInd++;
    if (curInd > indent) {
      stack.push(col);
      col = item.children;
    }
    if (curInd < indent) {
      col = stack.pop();
    }
    indent = curInd;
    item = {
        description: line.substr(curInd),
        children: []
    };
    col.push(item);
  }
  console.log(JSON.stringify(result, null, 2));
}

Tak třeba taková struktura


var input =
`aaa
        bbb
        bbb
                ccc
                ccc
                        ddd
        bbb (tady začíná problém)
        bbb
        bbb
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                        ddd
                        ddd
                        ddd
                                eee
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                ccc
                        ddd
                        ddd
                                eee
                        ddd`;

Vygeneruje tohle / Jako by se to nedokázalo vrátit zpět o více jak jednu úroveň.

Dal jsem to na pastebin, překročen asi znakový limit.

https://pastebin.com/cg5tRCKQ

Díky, že se na to mrkneš

function parse(input) {
  const result = [];
  const stack = [];
  const lines = input.split("\n");
  let indent = 0;
  let col = result;
  let item;
  for (let i = 0; i < lines.length; i++) {
    const line = lines[i];
    let curInd = 0;
    while (line[curInd] === " ") curInd++;
    if (curInd > indent) {
      stack.push({ indent, col });
      col = item.children;
    }
    if (curInd < indent) {
      let s;
      do {
        s = stack.pop();
      } while (s.indent > curInd)
      col = s.col;
    }
    indent = curInd;
    item = {
        description: line.substr(curInd),
        children: []
    };
    col.push(item);
  }
  console.log(JSON.stringify(result, null, 2));
}

Děkuji, výpis funguje super.

Je prosím tě rozdíl mezi tím, že vypíšu
console.log(json.substr(1, json.length - 2));

a nebo to uložím do proměnné?
treeData = json.substr(1, json.length - 2);

Pokud to uložím do proměnní a vypíšu obsah proměnné,
console.log(treeData);

tak je výsledek totožný jako tohle
console.log(json.substr(1, json.length - 2));

a přesto to nefunguje, Pokud to zkopíruji z konzole přímo do kódu, tak to funguje.

Ano pro první případ to funguje jak píšeš, tedy při použití hranatých závorek
Našel jsem na webu lepší vykreslování elementů - který má úplně stejnou strukturu, jen to není obaleno v těch hranatých závorkách ale ve složených závorkách, a to už použitím proměnné result nejde.

Zpět do poradny Odpovědět na původní otázku Nahoru