Avatar billede websam Nybegynder
06. marts 2009 - 15:04 Der er 5 kommentarer og
1 løsning

Recursive function ud fra json streng ?

Hejsa,

Som overskriften siger skal jeg bruge noget hjælp til at lave en recursiv function ud fra en json streng. Hvis jeg har denne json streng :

[
    {"property":
        {"name": "node1"}
    },
    {"property":
        {"name": "node2"},
            "children":[
                {"property":
                    {"name": "node2.1"}
                },
                {"property":
                    {"name": "node2.2"},
                        "children":[
                            {"property":
                                {"name": "node2.2.1"}
                            },
                            {"property":
                                {"name": "node2.2.2"}
                            }
                        ]
                    }
                }
            ]
        },
    {"property":
        {"name": "node3"}
    },
    {"property":
        {"name": "node4"}
    }
]

Hvordan kan jeg så lave en rekursiv function til at få denne markup :

<ul>
    <li><span>node1</span></li>
    <li><span>node2</span>
        <ul>
            <li><span>node2.1</span></li>
            <li><span>node2.2</span>
                <ul>
                    <li><span>node2.2.1</span></li>
                    <li><span>node2.2.2</span></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><span>node3</span></li>
    <li><span>node4</span></li>
</ul>

Jeg er ikke ude efter en komplet opbyggelse af elementerne, men jeg skal bruge noget hjælp til at lave selve den recursive function.
Avatar billede olebole Juniormester
07. marts 2009 - 18:26 #1
<ole>

Det er en lidt sær JSON-streng. Hvor kommer den fra - og må jeg foreslå en anden struktur?

/mvh
</bole>
Avatar billede olebole Juniormester
07. marts 2009 - 19:08 #2
Hvis du i stedet laver denne struktur:

[
    {"name": "node1"},
    {"name": "node2",
        "children": [
            {"name": "node2.1"},
            {"name": "node2.2",
                "children": [
                    {"name": "node2.2.1"},
                    {"name": "node2.2.2"}
                ]
            }
        ]
    },
    {"name": "node3"},
    {"name": "node4"}
]

- kan du bruge denne kode:

<script type="text/javascript">
var sJson  = '[{"name":"node1"},{"name":"node2","children":[{"name":"node2.1"},{"name":"node2.2","children":[{"name":"node2.2.1"},{"name":"node2.2.2"}]}]},{"name":"node3"},{"name":"node4"}]';

function insertData(oContainer, oNode) {
    var oLi = oTempl.li.cloneNode(true);
    oContainer.appendChild(oLi);
    oLi.getElementsByTagName("span")[0].firstChild.nodeValue = oNode.name;
    if (oNode.children) {
        var oUl = oTempl.ul.cloneNode(true);
        oLi.appendChild(oUl);
        for (var i=0,j=oNode.children.length; i<j; i++) {
            insertData(oUl, oNode.children[i]);
        }
    }
}
function insertJson(sJson) {
    var aNodes = eval("("+sJson+")");
    var oUl = oTempl.ul.cloneNode(true);
    oTree.appendChild(oUl);
    for (var i=0,j=aNodes.length; i<j; i++) {
        insertData(oUl, aNodes[i]);
    }
}

var oTree = oTempl = null;
window.onload = function() {
    oTree = document.getElementById("tree");
    oTempl = {ul:oTree.removeChild(oTree.getElementsByTagName("ul")[0])};
    oTempl.li = oTempl.ul.removeChild(oTempl.ul.getElementsByTagName("li")[0]);
}
</script>

<p><button onclick="insertJson(sJson)">TEST</button>

<div id="tree">
<ul>
    <li><span>&nbsp;</span></li>
</ul>
</div>
Avatar billede websam Nybegynder
09. marts 2009 - 18:37 #3
Det var et meget fornemt eksempel, tak for det. Jeg kan se du benytter dig af en "template" som du så kloner og befolker.

Ville der være noget i vejen for at oprette elementerne fra javascript frem for at klone/befolke ?

Grunden til spørgsmålet er at ideen var at listen skal loades ved klik på link og derefter indsættes i DOM uden at have andet end et div tag som container til listen.
Avatar billede olebole Juniormester
10. marts 2009 - 13:51 #4
Nej, det kan du sagtens gøre. Jeg viste blot fremgangsmåden med en template, fordi mange overser den mulighed og brokker sig over 'besværet' med at oprette enkeltelementer. Faktisk afvikler det ikke engang hurtigere med en template, så du klemmer bare på  ;o)

Derudover håber jeg, du er enig i, der er tale om en bedre og mere logisk JSON-struktur  =)
Avatar billede websam Nybegynder
10. marts 2009 - 17:45 #5
Ja jeg er helt enig med dig hvad angår JSON, dog har jeg lavet den sådan :

{"items":[. . alle noder . .]}

på den måde får jeg et object ved navn "items" som indeholder et array med top og under noder, efter forskrifterne (www.json.org) skulle jeg godt kunne gøre sådan.

Jeg roder lidt videre med det og ser om ikke jeg kan få noget kollaps/expand bygget på, sammen med nogle +/- billeder og poster resultatet, så kan andre få muligheden for at se det ;o)

Tak for hjælpen ;o)
Avatar billede websam Nybegynder
10. marts 2009 - 18:23 #6
Hvordan går det for øvrigt med din bog ?

For noget tide siden læste jeg i en tråd at du var igang med en javascript bog er den kommet på gaden ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester