Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590

    scorrere json multidimensionale

    salve, ho un array
    var stack=new Array('N1','N15');
    e file json così costituito
    codice:
    {    "name": "root",
        "id": "N0",
        "type": "root",
        "children": [
            {
                "name": "livello1",
                "size": 2000,
                "id": "N1",
                "children": [   
                         {
                               "name": "livello2",
                               "size": 1000,
                               "id": "N12",
                               "children": null
                           }
    ...
    in altre parole un semplice json multidimensionale.

    Vorrei scorrere questo file e aggiungere ad un array di supporto (activenodes) un riferimento al nodo con id=NXX.

    il codice è questo, ma è veramente brutto, e per ora copre solo il primo livello di profondità del json, per coprire i restanti dovrei fare altri for nidificati.
    C'è modo di migliorare il tutto con una funzione ricorsiva o comunque più efficiente?
    Ho provato con la ricorsione ma come vedete non è possibile in maniera immediata, il controllo su nodeid lo faccio in maniera diversa sul livello 0 e sugli altri livelli (prima value==nodeid e poi nodeid==obj.id) vorrei almeno uniformare tutto al secondo metodo..

    codice:
    function SeekAndPush(json,nodeid){
        $.each(json, function(key, value) {
            if(key==='id'&& value==nodeid) {
                activenodes.push(json)
            }
            if(key=='children' ) {
                $.each(value, function(i,obj) {
                    if(nodeid==obj.id) {
                        console.log(obj)
                        activenodes.push(obj)
                    }
                        
                })
            }
        });
    
    }
    Ultima modifica di jimbo0; 04-06-2015 a 12:54

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    Quello che vuoi fare non credo sia possibile se non modificando l'oggetto(json) originario. Questo perche per poter scorrere l'intero oggetto ogni nodo dovrebbe avere un riferimento al nodo padre cosi da poter scorrerlo sia in discesa che in salita. Se il json lo generi tu e quindi lo puoi modificare farei cosi:

    per prima cosa aggiungi 2 funzioni per ogni nodo(parent e next), es:
    codice:
    var myjson = {    "name": "root",     "id": "N0",     "type": "root", parent: function(){return null;}, next: function(){return null;},
        "children": [
            {
                "name": "livello1",
                "size": 2000,
                "id": "N1",
                parent: function(){return myjson;},
                next: function(){return myjson.children[1];},
                "children": [   
                         {
                               "name": "livello2",
                               "size": 1000,
                               "id": "N11",
                           parent: function(){return myjson.children[0];},
                           next: function(){return myjson.children[0].children[1];},
                               "children": null
                           },
                    {
                               "name": "livello2",
                               "size": 1000,
                               "id": "N12",
                      parent: function(){return myjson.children[0];},
                      next: function(){return null;},
                               "children": null
                           }
                 ]
            },
            {
                "name": "livello1",
                "size": 2000,
                "id": "N2",
              parent: function(){return myjson;},
              next: function(){return myjson.children[2];},
                "children": [   
                         {
                               "name": "livello2",
                               "size": 1000,
                               "id": "N21",
                           parent: function(){return myjson.children[1];},
                           next:function(){return myjson.children[1].children[1];},
                               "children": null
                           },
                    {
                               "name": "livello2",
                               "size": 1000,
                               "id": "N22",
                      parent: function(){return myjson.children[1];},
                      next: function(){return null;},
                               "children": null
                           }
                 ]
            }
        ]
    };
    A questo punto si può usare una funzione ricorsiva, qualcosa del genere:

    codice:
    isUp = false;
    function SeekAndPush(json,nodeid){
      if(isUp){
          if(json.next() != null){ 
            isUp = false;
            SeekAndPush(json.next(), nodeid);
          }else if(json.parent() != null){ 
            SeekAndPush(json.parent(), nodeid);
          }
        }else{
          if(json.id == nodeid) {
            activenodes.push(json);
          }
          
          if(json.children != null){ 
            SeekAndPush(json.children[0], nodeid);
          }else if(json.next() != null){
            SeekAndPush(json.next(), nodeid);
          }else if(json.parent() != null){
            isUp = true;
            SeekAndPush(json.parent(), nodeid);
          }
       }
    }
    Ultima modifica di Vindav; 05-06-2015 a 11:44

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590
    grazie mille veramente dell'impegno, non sai quanto apprezzo nei forum le persone che non si limitano a rispondere solo alle questioni banali ma ragionano effettivamente su un problema.

    comunque, in due parole, ho ripensato tutto il sistema e non uso più l'array stack, scrivo direttamente in activenodes. Durante l'azione di aggiunta nodo (che poi è il click sul nodo) aggiungo direttamente il riferimento al nodo cliccato, non passo per il suo id.
    Ho alleggerito il codice e risolto anche questo problema.
    Risolto per ora, perché probabilmente nel prossimo passo il tuo codice mi sarà comunque utile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.