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ř… nový
Pavel 29.01.2020 16:38
Pavel
Ano ano, přesně tak, tohle je absolutně pro amatéra nepřehledné. nový
Fr.Buran 29.01.2020 16:41
Fr.Buran
Díky za rady, vidím, že to tu žije... nový
Fr.Buran 30.01.2020 17:24
Fr.Buran
No a chceš poradit, nebo chceš aby to někdo udělal za tebe? nový
Wikan 30.01.2020 17:27
Wikan
... a nebo chce třeba jen kritizovat. Kolika lidem tady poradil on? nový
host 30.01.2020 17:30
host
Vidíš tady snad nějakou radu? nový
Fr.Buran 30.01.2020 20:47
Fr.Buran
Vidíš tady snad někde záruku, že každý dotaz bude vyřešen? nový
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… nový
Wikan 30.01.2020 22:08
Wikan
Tak ve finále to stejně vyšlo nastejno. nový
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. nový
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. nový
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… nový
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… nový
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… nový
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… nový
Fr.Buran 31.01.2020 23:28
Fr.Buran
function parse(input) { const result = []; const stack = []; const lines = input.split("\n"); let in… nový
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… nový
Fr.Buran 01.02.2020 12:14
Fr.Buran
const json = JSON.stringify(result, null, 2); console.log(json.substr(1, json.length - 2)); nový
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… nový
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. nový
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… nový
Fr.Buran 01.02.2020 16:22
Fr.Buran
To ale bude fungoval jenom s jedním elementem na nejvyšší úrovni. nový
Wikan 01.02.2020 17:01
Wikan
Nerozumím co tím myslíš. nový
Fr.Buran 01.02.2020 18:41
Fr.Buran
aaa bbb bbb aaa bbb Tohle nebude fungovat, protože tam jsou dva "aaa" prvky. nový
Wikan 01.02.2020 20:18
Wikan
To nevadí, tohle funguje root aaa bbb bbb aaa bbb nový
Fr.Buran 01.02.2020 20:45
Fr.Buran
V tom případě stačí: result[0] nový
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