【问题标题】:How to generate nested json object from nested list with javascript/jquery如何使用 javascript/jquery 从嵌套列表中生成嵌套 json 对象
【发布时间】:2011-09-29 08:42:15
【问题描述】:

我想生成以下对象:

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

来自以下 HTML:

<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>

我是循环/数组/对象的新手 - 所以非常感谢您的帮助!

如果有帮助,我会在这个项目的其他地方使用 jQuery。

谢谢!

【问题讨论】:

  • 不是 JSON。它只是一个 JavaScript 对象。
  • 我在您的 html 中没有看到常规模式。您必须手动完成
  • 这个 html 在哪里?我认为也许你想要完成的事情有不同的解决方案。我可能会使用 XLST,因为这就是我所知道的,但很难从你的文字中找出你想要什么。'
  • XSLT 生成 json..suuuuuuure.
  • @Felix:是的,我将它保存到 localStorage 中的 JSON。

标签: javascript jquery javascript-objects


【解决方案1】:

有多种方法。这是一个:

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

如果您更改 HTML 的结构,这很可能会中断。如果你有很多这样的数据,这段代码也可能会很慢。

要了解使用的方法,请查看jQuery documentation

【讨论】:

    【解决方案2】:

    它没有经过优化,但它可以工作:

    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);
    

    【讨论】:

      【解决方案3】:

      您是如何生成 HTML 的?如果您使用的是 PHP,您可以只将变量传递给 JS,而不是稍后尝试从 HTML 中读取它们。例如,如果您将它们放在数组中,则可以在 PHP 中使用 json_encode,然后在您的页面中的 variables = jQuery.parseJSON(here); 中回显它;

      现在,如果你不能这样做,并且你真的想从 HTML 中读取它,那么你应该首先使用 $('#data') 选择 id 数据并获取它的 children()。然后为孩子们使用 .each() 。然后将孩子放入对象,然后使用 .each() 检查其每个 children() 并将它们添加到您的对象中。如果您可能不止这些级别,我建议为此执行递归函数。

      PS:我认为将 Span 放在 UL 和 LI 之间的 HTML 不合适。

      【讨论】:

      • 感谢您的回复! HTML 是从 localStorage 中的 JSON 解析的 var 填充的——这很容易。我试图弄清楚如何保存对对象所做的更改,然后再使用 JSON.stringify 将其保存回 localStorage。关于spanul:是的!这是为了简化我的问题:)。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多