【问题标题】:Use jQuery to sort List Items alphabetically - then sort special items Numerically [duplicate]使用jQuery按字母顺序对列表项进行排序-然后按数字对特殊项目进行排序[重复]
【发布时间】:2013-01-09 23:25:21
【问题描述】:

可能重复:
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 菜鸟,所以我怀疑自己能否找到正确的代码 :)

谢谢!!

【问题讨论】:

  • 您可以使用data-* 属性而不是类来表示列表项值吗?
  • 好问题。我不熟悉 data-* 属性,但是如果运行 jQuery 的浏览器通常不能识别 data-* 属性(IE7/8?),我想知道 jQuery 是否可以访问这些属性的值。我会调查的,谢谢!
  • @JohnKoerner - 已经很接近了,但我还想在最初的 JS 排序之后进行第二次重新排序。一旦字母排序完成,我只想以数字方式重新排序选择的元素。
  • @LearnWebCode caniuse.com/dataset
  • IIRC,类名不能以数字开头。或者至少不在 CSS 类选择器中。 data-* 属性在这里似乎更合适,因为这些数字并没有真正“分类”元素。

标签: javascript jquery


【解决方案1】:

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

对于您的比较器,您需要一些可以给您一对&lt;li&gt; 元素的东西,并告诉您哪个先出现:

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 循环的工作原理是获取每个已排序的项目,并将其添加到 &lt;ul&gt; 的末尾 - 当没有剩余时,它就完成了。

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

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

See this jsfiddle

【讨论】:

  • 哇,感谢您的帮助!你的代码看起来很棒。 sort() 是 jQuery 库的一部分,对吗?或者是需要使用sort()的插件。我不是要 110% 用勺子喂食,但 JS Fiddle 似乎并没有重新排序任何元素。我试图分析发生了什么,但我不确定除了 sort() 默认情况下可能不可用之外还有什么问题?
  • @LearnWebCode 不,这是默认的 JS Array.sort 函数,因为 jQuery 对象 $('li') 实际上是一个数组。小提琴在 Chrome 24 上对我有用(导致 X Y Z A B C D E)。
  • 假设我们需要对所有事情使用 jQuery 并忽略常规 JS 函数 :) 谢谢!!
  • 看起来它在 Webkit(Chrome、Safari)中运行良好,但由于某种原因它在 Firefox 中无法运行,但这是浏览器兼容性问题,而不是排序逻辑问题,谢谢!!)
  • @LearnWebCode 请注意,我使用 jQuery 进行重新排序,但比较器中没有 jQuery 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2020-02-06
相关资源
最近更新 更多