代码之家  ›  专栏  ›  技术社区  ›  mellowsoon

jquery:分组类似项

  •  3
  • mellowsoon  · 技术社区  · 15 年前

    使用jquery,我试图将类似的项目分组到一个列表中。这就是我要做的。给出如下列表:

    <ul>
        <li class="foo">Item #1</li>
        <li class="foo">Item #2</li>
        <li class="foo">Item #3</li>
        <li class="bar">Item #4</li>
        <li class="bar">Item #5</li>
        <li class="foo">Item #6</li>
        <li class="foo">Item #7</li>
        <li class="bar">Item #8</li>
    </ul>
    

    最后我想说的是:

    <ul>
        <li class="foo">Item #1 <a>2 More Like This</a>
            <ul>
                <li class="foo">Item #2</li>
                <li class="foo">Item #3</li>
            </ul>
        </li>
        <li class="bar">Item #4</li>
        <li class="bar">Item #5</li>
        <li class="foo">Item #6 <a>1 More Like This</a>
            <ul>
                <li class="foo">Item #7</li>
            </ul>
        </li>
        <li class="bar">Item #8</li>
    </ul>
    

    简言之,只要有两个或两个以上的项目具有class=“foo”,就应该将它们组合在一起,直到到达一个非class=“foo”项目。然后我可以使用链接来显示或隐藏分组的项目。

    2 回复  |  直到 15 年前
        1
  •  3
  •   user113716    15 年前

    有一种可能性:

    例子: http://jsbin.com/ipiki3/3/

    $('ul > li.foo')
        .filter(function() {
            var $th = $(this);
            return $th.next('li.foo').length && !$th.prev('li.foo').length;
        })
        .each(function() {
            var $th = $(this);
            var len= $th.append('<a href="#"> more like this</a>')
                        .nextUntil(':not(li.foo)').wrapAll('<ul>').length;
            $th.next('ul').appendTo(this);
            $th.children('a').prepend(len);
        });
    

    编辑: 修正了一个错误 len 变量,并添加了一个示例。


    说明: 发生了什么事 .filter() 是缩小了 li.foo 元素到组中的第一个元素 (至少有一个 利福 之后,之前没有) .

    然后与 .each() 它补充了 <a> ,get是下一个元素,直到它到达非 利福 ,用 <ul> 并返回有多少人在使用 length 财产。

    然后我们转到那个新的 <UL & GT; 把它附加到第一个 利福 在小组中。

    最后,我们把储存在 长度 属性到 <A & GT; 元素。

        2
  •  1
  •   jcubic    15 年前

    我想到这个:

    $(document).ready(function() {
        var groups = {}
        $('ul li').each(function() {
            var self = $(this);
            var class_name = self.attr('class');
            if (class_name) {
                if (typeof groups[class] == 'undefined') {
                    groups[class_name] = [];
                }
                groups[class_name].push(self);
            }
        });
        var ul = $('ul');
        ul.empty();
        for (class_name in groups) {
            var array = groups[class_name];
            ul.append('<li class="' + class_name + '">' + $(array[0]).html() + 
                '<a>More Like this</a><ul></ul>');
            $(array.splice(1)).each(function() {
                ul.find('li.' + class_name + ' ul').append(this);
            });
    
        }
    
    });