2015-07-30 11 views
7

Attualmente mi occupo di emettere per iscritto una funzione recrudente per ordinare alcuni dati JSON. Ho diversi array annidati di oggetti che ho bisogno di ordinare in singole diapositive. La struttura è simile al seguente:Ordinamento della funzione ricorsiva in array di matrici

[ 
{ 
    "title": "a", 
    "children": [ 
     { 
      "title": "a-a", 
      "children": [ 
       { 
        "title": "a-a-a" 
       }, 
       { 
        "title": "a-a-b" 
       } 
      ] 
     }, 
     { 
      "title": "a-b", 
      "children": [ 
       { 
        "title": "a-b-a" 
       }, 
       { 
        "title": "a-b-b" 
       } 
      ] 
     } 
    ] 
}, 
{ 
    "title": "b", 
    "children": [ 
     { 
      "title": "b-a", 
      "children": [ 
       { 
        "title": "b-a-a" 
       }, 
       { 
        "title": "b-a-b" 
       } 
      ] 
     }, 
     { 
      "title": "b-b", 
      "children": [ 
       { 
        "title": "b-b-a" 
       }, 
       { 
        "title": "b-b-b" 
       } 
      ] 
     } 
    ] 
} 
] 

Ho scritto una funzione ricorsiva:

var catalog = { 

init: function() { 

    var _this = this; 

    $.getJSON("catalog.json", function(data) { 

     _this.slides = []; 
     _this.parseCategories(data.catalog.category,-1,0); 

    }); 

}, 

parseCategories: function(array, depth, prevParent) { 
    ++depth; 

    if (!this.slides[depth]) this.slides[depth] = []; 
    if (!this.slides[depth][prevParent]) this.slides[depth][prevParent] = []; 

    this.slides[depth][prevParent].push(array); 

    for (var i = 0; i < array.length; i++) { 

     if (array[i].category) { 

      this.parseCategories(array[i].category, depth, i); 
     } 
    } 

} 

} 

catalog.init(); 

Questo uscite:

enter image description here

Tuttavia invece di recuperare i dati per il mio terzo slide under format:

aaa

aba

aca

vorrei ottenere

AA- [a, b, c]

mi chiedevo se era possibile dal momento che io non sono molto bravo a gestire i processi ricorsivi. Spero di essere stato chiaro e grazie per aver letto questo. Fondamentalmente ho bisogno di mantenere la mia struttura dati originale, ma rimuovere il primo livello di profondità per ogni iterazione (scorrere in un cursore che rappresenta l'aumento della profondità nella mia struttura dati).

+0

Non sono sicuro di aver capito il tuo problema esatto. Ho risolto un problema simile recentemente, e forse [quella risposta] (http://stackoverflow.com/a/31461290/361762) ti aiuterà. In caso contrario, per favore, vedi se riesci a chiarire il problema: le immagini dell'output atteso in cima sono utili e qualcosa del genere con i tuoi risultati effettivi potrebbe aiutare a spiegare. – dave

+0

Grazie per la tua risposta, sfortunatamente credo che il mio problema potrebbe essere leggermente più complicato. Ho modificato il mio post con una nuova immagine che si confronta con l'output restituito dalla funzione e l'output di cui ho effettivamente bisogno. L'idea è che ho bisogno di costruire un cursore attraverso un modello di manubri e navigare tra bambini e genitori nascondendo tutti i dati non necessari. Pertanto il mio output deve restituire i dati sotto forma di array per profondità e strutturare ciascuna sottocategoria in un array mentre la profondità aumenta. Potrei usare diversi cicli, ma temo i costi delle prestazioni. –

+6

Potresti fornire la tua vera struttura JSON? Il tuo attuale JSON non corrisponde con l'esempio nell'immagine. Se possibile un jsfiddle con quello che hai fatto –

risposta

0

Recentemente ho scritto un algoritmo per gestire in modo ricorsivo i dati come questo. Ecco un jsfiddle e la funzione principale

console.log('starting'); 
// data in tree format. 
var output = {}; 
// data in slide format ["a-a-a", "a-a-b", "b-b-a", "b-b-b"] 
var outputStrs = []; 
parseData(data, output); 
console.log(output); 
console.log(outputStrs); 

function parseData(data, store) { 
    // go through each element 
    for (var i = 0; i < data.length; i++) { 
     var element = data[i]; 
     // used to keep track of where we are in the tree. 
     var splitElement = element.title.split('-'); 
     var titleStart = splitElement[0]; 
     // console.log(element); 
     if (_.has(element, 'children') && _.isArray(element.children)) { 
      // if there is a children, then recursively handle it. 
      store[titleStart] = {}; 
      parseData(element.children, store[titleStart]); 
     } else { 
      // if we are at the end, then add in the data differently. 
      var titleEnd = splitElement[splitElement.length-1]; 
      store[titleEnd] = titleEnd; 
      // create the slides 
      var slide = []; 
      for (var j = 0; j < splitElement.length; j++) { 
       if (j !== splitElement.length - 1) { 
        slide.push(titleStart); 
       } else { 
        slide.push(titleEnd); 
       } 
      } 
      slide = slide.join('-'); 
      if (!_.contains(outputStrs, slide)) outputStrs.push(slide); 
     } 
    } 
} 

Con questi dati l'uscita dovrebbe essere simile a

a 
    a 
     a 
     b 
b 
    b 
     a 
     b 

E outputStrs assomiglierà AA- [a, b, c]

Spero che questo aiuti! !!

+0

Grazie mille, in realtà avevo semplificato l'intero sistema per adattarlo alle mie esigenze (aggiungendo un marcatore nella dom invece di provare a formattare perfettamente la matrice), ma questo potrebbe adattarsi alla mia precedente necessità. –

Problemi correlati