javascript - 使用 jQuery 按字母顺序对列表项进行排序 - 然后按数字对特殊项进行排序

标签 javascript jquery

<分区>

Possible Duplicate:
How may I sort a list alphabetically using 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 菜鸟,所以我怀疑我自己能否找到正确的代码:)

谢谢!!

最佳答案

您需要一个比较函数,以及一种重新排列元素的方法。插件可用,前者将为您完成后者,但如果元素是单亲的唯一子元素,则非常容易(见下文)。

对于你的比较器,你需要一些可以给你的 <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'));

See this jsfiddle

关于javascript - 使用 jQuery 按字母顺序对列表项进行排序 - 然后按数字对特殊项进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14531277/

相关文章:

javascript - 计算字符串中的单词

javascript - 自定义元素/Web 组件可以与 SVG 一起使用吗?

javascript - 使用 jQuery 检测 DIV 中是否存在滚动条?

javascript - 如果我有一个适用于除 IE 之外的所有浏览器的 CSS 解决方案,那么应该为 IE 选择什么? CSS 表达式 vs JavaScript vs 带有插件的 jQuery?

jquery - 为什么 jQuery 不提供 .firstChild 方法?

使用 keyup 和模糊进行 jQuery 文本框验证

javascript - 根据屏幕尺寸更改过渡类型

php - 如何在JS中检查PHP是否从数据库中删除了数据?

javascript - 如何在 bootstrap-wysiwyg 中使用 "change event"?

javascript - 将元素插入 DOM,基于时间戳的位置