循环嵌套列表' ol'分子

时间:2014-12-15 20:50:00

标签: jquery json list serialization nested-lists

我正在尝试将我的hierarhical列表序列化为json这样的对象;

[
  {title: title1,id: 1,children: [
              {title: title1_1,id: 1_1,children: [
                   {title: title1_1_1,id: 1_1_1,children: []},
                   {title: title1_1_2,id: 1_1_2,children: []}
              ]}
   ]},
   {title: title2,id: 2,children: [
        {title: title2_1,id: 2_2,children: []}
   ]}
 ]

我的列表结构如下:

<ol class="sortable">
    <li><label>title1</label>
        <ol>
            <li><label>title1_1</label>
                <ol>
                    <li><label>title1_1_1</label>
                        <ol></ol>
                    </li>
                    <li><label>title1_1_2</label>
                        <ol></ol>
                    </li>
                </ol>
            </li>
        </ol>
    </li>
    <li><label>title2</label>
        <ol>
            <li><label>title2_1</label>
                <ol></ol>
            </li>
        </ol>
    </li>
</ol>

我已经编写了序列化函数:

function toJson(object, jsonObject) {
    return jsonObject 
           + "{\"title\":\"" 
           + object.children('label').text() 
           + "\", \"children\":\"" 
           + listToJson(object.children("ol").children("li"),jsonObject) 
           + "\"}";
}

function listToJson(list,jsonObject) {
    jsonObject = jsonObject + "[";
    list.each(function(idx, li) {
        jsonObject = toJson($(li).children('ol'),jsonObject);
    });
    jsonObject = jsonObject + "]";
    return jsonObject;
}

和执行功能:

  var jsonObject = "";
  jsonObject = listToJson($("ol.sortable > li"),jsonObject);

但我无法让它发挥作用。我认为这是因为当我打电话给.children(ol)时,它会在整个结构中停止而不是在第一级停止。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我不确定你为什么要使用手动创建JSON,我不建议你这样做。这是一个非常简化的东西:

的Javascript

$(document).ready(function()
{
    function toObject(element)
    {
        var result = [];
        // make sure we're using jquery elements
        var $element = $(element);
        var $children = $element.children('li');
        $children.each(function()
        {
            var $this = $(this);
            var item = {};
            item.title = '';

            var $label = $this.find('label').first();
            if ($label.length == 1)
            {
                item.title = $label.text();
            }

            // should only be one OL
            var $grandchild = $this.children('ol').first();

            item.children = toObject($grandchild);

            result.push(item);
        });

        return result;
    }

    var $target = $('ol.sortable');
    var o = toObject($target);
    var json = JSON.stringify(o);

    $('pre').text(json);
});

结果(无论如何更好的JSON):

  

[{“title”:“Faza przygotowawcza”,“children”:[{“title”:“Uzyskaj dane kontaktowe klienta”,“children”:[{“title”:“Wizytówkaklienta”,“children”: []},{“title”:“Ankieta-Dane klienta”,“children”:[]}]}]},{“title”:“Faza realizacji”,“children”:[{“title”:“Wprowadź klienta do systemu“,”children“:[]}]}]

我没有添加ID,但是如果你真的需要它,请告诉我这个代码并不难。

JSFiddle Example