使用jquery生成任意深度列表

时间:2011-03-11 19:09:17

标签: javascript jquery

在javascript中,我有一个对象数组,代表一个任意深度的列表...

data =
[
 { title, depth },
 { title, depth },
 { title, depth }, 
 { title, depth }, 
]

...深度是元素列表中的深度。

我想将此数据转换为html。

例如:

[
 { title: "one", depth : 1 },
 { title: "two", depth : 1 },
 { title: "three", depth : 2 }, 
 { title: "four", depth : 3 }, 
 { title: "five", depth : 1 }, 
]

...变为

<ul>
  <li><p>one</p></li>
  <li>
    <p>two</p>
    <ul>
      <li>
        <p>three</p>
        <ul>
          <li><p>four</p></li> 
        </ul>
      </li>
    </ul>
  </li>
  <li><p>five</p></li>
</ul>

使用jQuery最简单的方法是什么?

由于

4 个答案:

答案 0 :(得分:7)

这是你可以做到的一种方式:

(function($) {
  $.listify = function(items) {
    var container = $('<div></div>'), root = container;
    var depth = 0;
    for (var i = 0; i < items.length; ++i) {
      var item = items[i];
      if (item.depth > depth) {
        while (item.depth > depth) {
          var ul = $('<ul></ul>').appendTo(container);
          var li = $('<li></li>').appendTo(ul);
          container = li;
          ++depth;
        }
      } else if (item.depth <= depth) {
        while (item.depth < depth) {
          container = container.parent().parent();
          --depth;
        }
        container = $('<li></li>').insertAfter(container);
      }
      container.append('<p>' + item.title + '</p>');
    }
    return root.children();
  }
})(jQuery);

我承认,我只是想说点什么。 Here is a jsFiddle.你会这样称呼它:

$.listify([
  { title: "one", depth : 1 },
  { title: "two", depth : 1 },
  { title: "three", depth : 2 }, 
  { title: "four", depth : 3 }, 
  { title: "five", depth : 1 }, 
]).appendTo(document.body);

答案 1 :(得分:3)

使用多个级别并正确嵌套标记:

(function ($) {
    $.makelist = function (arr) {  
    var currentdepth = 1;
    var root = $('<ul>');
    var el = root;
    var idx = 0;

    while (idx < arr.length) {
      if (arr[idx].depth == currentdepth) {
         el.append($('<li>').html($('<p>').text(arr[idx].title)));
         idx++;
      }
      else if (arr[idx].depth > currentdepth) {
        newel = $('<ul>');
        el.append(newel);
        el = newel;
        currentdepth++;
      }
      else {
        el = el.parent('ul');
        currentdepth--;
      }
    }
    return root;
  }
})(jQuery);

        $(document).ready(function () {
            arr = [
                     { title: "one", depth: 1 },
                     { title: "two", depth: 1 },
                     { title: "three", depth: 2 },
                     { title: "four", depth: 3 },
                     { title: "five", depth: 1 },
                    ];

            $('body').append($.makelist(arr));
        });

答案 2 :(得分:1)

这是动态的:

http://jsfiddle.net/wq8QY/

无论你走多少级别,它仍将一直创造。

 var json = [
 { title: "one", depth : 1 },
 { title: "two", depth : 10 },
 { title: "three", depth : 20 }, 
 { title: "four", depth : 25 }, 
 { title: "five", depth : 11 }, 
]
    var dom = $('body') ;
    dom.append($('<ul>'))
    //console.log(json.length)
    for( var i = 0; i < json.length; i++){
    //console.log(json[i])
        var appendTo = $('body')
        for(var j = 1; j <= json[i].depth; j++){
            console.log(appendTo, json[i], json[i].depth, '1st')
            if(appendTo.children('ul').length <= 0){
                console.log('no ul', j)
                appendTo.append($('<ul>'))
            }
           appendTo = $(appendTo.children('ul'))
            console.log(appendTo, json[i], '2nd')
        }
       console.log(appendTo, json[i], 'appending')
       appendTo.append($('<li><p>'+json[i].title+'</p></li>'))
    }

答案 3 :(得分:0)

$.fn.listify = function(list) {
    var stack = [this];
    $.each(list, function() {
        var item = $('<li><p>'+this.title+'</p></li>');
        stack[this.depth] = stack[this.depth] 
            ? item.insertAfter(stack[this.depth]) 
            : item.wrap('<ul>').appendTo(stack[this.depth - 1]);
        stack.length = this.depth + 1;
    });
}