1

可能重复:
如何使用 jQuery 按字母顺序对列表进行排序?

我正在使用 jQuery 来拯救有限的 CMS 设置。

我需要按字母顺序对有序列表进行排序,但随后我还需要能够将“特殊”列表项放在列表顶部,并再次仅对那些按“可选”数值降序的特殊项进行排序。

例如,如果这是我的原始标记:

<ul>
    <li class=" ">C</li>
    <li class=" ">A</li>
    <li class=" ">B</li>
    <li class=" ">E</li>
    <li class=" ">D</li>
    <li class="3">Z</li>
    <li class="6">Y</li>
    <li class="14">X</li>
</ul>

...我希望 jQuery 对其进行排序,因此这将是生成的 DOM 内容:

<ul>
    <li class="14">X</li>
    <li class="6">Y</li>
    <li class="3">Z</li>
    <li class=" ">A</li>
    <li class=" ">B</li>
    <li class=" ">C</li>
    <li class=" ">D</li>
    <li class=" ">E</li>
</ul>

如果无法按类值排序或过于复杂,也许我可以使用以下标记结构:

<ul>
    <li><span class="numerical">3</span><span class="alphabetical">B</span></li>
</ul>

有谁知道什么 jQuery 代码可以让我这样做?我是否需要运行一系列嵌套的“每个”操作以及以某种方式比较值的“insertAfter”和“insertBefore”函数?我认为有更好的方法,但我不确定从哪里开始我的研究。

我愿意接受任何和所有建议。与此同时,我也会尝试自己解决这个问题,但我仍然是一个 jQuery 新手,所以我怀疑我是否会自己找到正确的代码:)

谢谢!!

4

1 回答 1

4

您需要一个比较器功能,以及一种重新排列元素的方法。插件是可用的,因为前者将为您做后者,尽管如果元素是单亲的唯一孩子,这很容易(见下文)。

对于你的比较器,你需要一些可以给你一对<li>元素的东西,并告诉你哪个先出现:

function myCompare(a, b) {
    var cls_a = parseInt(a.classList, 10);
    var cls_b = parseInt(b.classList, 10);

    cls_a = cls_a || -1 ;   // make blank class == -1
    cls_b = cls_b || -1 ;   //   ditto

    if (cls_a === cls_b) {
        var str_a = a.innerText || a.textContent;
        var str_b = b.innerText || b.textContent;
        return str_a.localeCompare(str_b);
    } else {
        return cls_a - cls_b;  // numeric descending sort
    }
}

并重新排列:

var $el = $('li');
var $ul = $('ul');
$el.sort(myCompare);  // from above
$el.each(function() {
    $ul.append(this);
});

循环的.each工作方式是获取每个已排序的项目,并将其添加到<ul>- 的末尾,当没有剩余时,它就完成了。

上述的较短版本是可能的,例如:

$('li').sort(myCompare).appendTo($('ul'));

看到这个jsfiddle

于 2013-01-25T22:34:34.167 回答