2011-07-06 3 views
3

Je voudrais générer l'objet suivant:Comment générer objet JSON imbriqué de la liste imbriquée avec javascript/jquery

var ideaBoard = { 
    "Staff Retreat" : { 
     "Games" : [ 
      {"title" : "Rockband", "details" : "1hr"}, 
      {"title" : "Texas Hold em", "details" : "30min"} 
     ], 
     "Talks" : [ 
      {"title" : "The Old You", "details" : "Dr. Smith"} 
     ] 
    } 
} 

du HTML suivant:

<div id="data"> 
    <ul><span class="board-title">Staff Retreat</span> 
     <li><span class="category-title">Games</span> 
      <ul> 
       <li> 
        <span class="title">Rockband</span> 
        <span class="details">1hr</span> 
       </li> 
       <li> 
        <span class="title">Texas Hold em</span> 
        <span class="details">30min</span> 
       </li> 
      </ul> 
     </li> 
     <li><span class="category-title">Talks</span> 
      <ul> 
       <li> 
        <span class="title">The Old You</span> 
        <span class="details">Dr. Smith</span> 
       </li> 
      </ul> 
     </li> 
    </ul> 
</div> 

Je suis nouveau aux boucles/tableaux/objets - donc j'apprécie vraiment l'aide! J'utilise jQuery ailleurs dans ce projet, si cela peut aider.

Merci!

+1

Ce n'est pas JSON. C'est juste un objet JavaScript. –

+0

Je ne vois pas un motif régulier dans votre code HTML. vous devrez le faire manuellement – Ibu

+0

Où réside ce code html? Je pense que peut-être ce que vous essayez d'accomplir a une solution différente. J'utiliserais probablement XLST puisque c'est ce que je sais mais il est difficile de comprendre à partir de votre texte ce que vous voulez. – elgrego

Répondre

2

Il a plusieurs façons. Voici un:

var ideaBoard = {} 
$('#data > ul').each(function() { 
    var data = {}, // board data 
     title = $(this).find('.board-title').text(); // board title 

    // find categories 
    $(this).find('> li > .category-title').each(function() { 
     var category = $(this).text(), // category title 

     // we can use map to create the array 
     var category_data = $(this).next().children('li').map(function() { 
      var tdata = {}; 

      // each span contains detailed data 
      $(this).children('span').each(function() { 
       tdata[this.className] = $(this).text(); 
      }); 

      return tdata; 
     }).get(); 

     data[category] = category_data; 
    }); 

    ideaBoard[title] = data; 
}); 

DEMO

Ce briserai le plus probable si vous modifiez la structure du code HTML. Si vous avez beaucoup de données comme celles-ci, ce code peut également être assez lent. Pour en savoir plus sur les méthodes utilisées, consultez le jQuery documentation.

+0

Cela a fait l'affaire! Merci beaucoup! – Josiah

0

Il n'est pas optimisé, mais il fonctionne:

var result = {}; 
var node1; 
var node2; 
var node3; 
var tmpObj = {}; 
$('#data > ul').each(function() { 
    node1 = $(this); 
    result[node1.find('.board-title').text()] = {}; 
    node1.find('.category-title').each(function() { 
     node2 = $(this); 
     result[node1.find('.board-title').text()][node2.text()] = []; 
     node2.next('ul').children('li').each(function() { 
      node3 = $(this); 
      tmpObj = {}; 
      node3.children('span').each(function() { 
       tmpObj[$(this).attr('class')] = $(this).text(); 
      }); 
      result[node1.find('.board-title').text()][node2.text()].push(tmpObj); 
     }) 
    }); 
}); 
console.log(result); 
+0

Merci pour l'aide! – Josiah

0

Comment générez-vous le code HTML? Si vous utilisez PHP, vous pouvez simplement passer les variables à JS plutôt que d'essayer de les lire plus tard à partir du HTML. Par exemple, si vous les avez dans un tableau, vous pouvez utiliser json_encode en PHP et ensuite en écho dans votre page à l'intérieur des variables = jQuery.parseJSON (ici);

Maintenant, si vous ne pouvez pas le faire, et que vous voulez vraiment le lire à partir du HTML, vous devez d'abord sélectionner l'ID avec $ ('# data') et prendre ses enfants(). Ensuite, utilisez .each() pour les enfants. Ensuite, placez l'enfant à l'objet, puis vérifiez ses chaque enfants() avec .each() et ajoutez-les à votre objet. Si vous avez plus que ces niveaux, je vous recommande de faire une fonction récursive pour cela. PS: Je ne pense pas que son propre HTML pour mettre SPAN entre UL et LI.

+0

Bon point concernant le 'span' dans le' ul' ... –

+0

Merci pour la réponse! Le HTML est peuplé à partir d'un var analysé de JSON dans localStorage - ce qui était assez facile. Je suis resté bloqué en essayant de comprendre comment enregistrer les modifications apportées à l'objet avant de le sauvegarder dans localStorage avec JSON.stringify. En ce qui concerne 'span' et' ul': Oui! C'était pour simplifier dans ma question :). Merci encore! – Josiah

Questions connexes