javascript - jQuery 或下划线按跨度文本对列表进行排序

标签 javascript jquery underscore.js

尝试按 li 中的跨度对 ul 列表进行排序时,我有点迷茫。
这是我的 html 代码:

<ul id="appsList">
    <li><span>aa</span>  <span class="sort">android</span></li>
    <li><span>aa</span>  <span class="sort">ios</span></li>
    <li><span>aa</span>  <span class="sort">facebook</span></li>
    <li><span>bb</span>  <span class="sort">android</span></li>
    <li><span>bb</span>  <span class="sort">ios</span></li>
    <li><span>bb</span>  <span class="sort">facebook</span></li>
</ul>

我有一个包含平台名称的数组,不需要包含所有平台,数组中平台的顺序无关紧要。 我希望列表按字母顺序排序,然后按 第一个跨度的字母顺序。

因此,如果我的数组是 ["ios","android","facebook"] 我想按字母顺序排列数组中的元素以及它们的第一个跨度值。 因此,在对数组进行排序后,我们将得到:

<ul id="appsList">
    <li><span>aa</span>  <span class="sort">android</span></li>
    <li><span>bb</span>  <span class="sort">android</span></li>
    <li><span>aa</span>  <span class="sort">facebook</span></li>
    <li><span>bb</span>  <span class="sort">facebook</span></li>
    <li><span>aa</span>  <span class="sort">ios</span></li>
    <li><span>bb</span>  <span class="sort">ios</span></li>
</ul>

如果数组只是 ["ios"],则按数组元素的字母顺序排序,然后列表的其余部分也按字母顺序排序:

<ul id="appsList">
    <li><span>aa</span>  <span class="sort">ios</span></li>
    <li><span>bb</span>  <span class="sort">ios</span></li>
    <li><span>aa</span>  <span class="sort">android</span></li>
    <li><span>bb</span>  <span class="sort">android</span></li>
    <li><span>aa</span>  <span class="sort">facebook</span></li>
    <li><span>bb</span>  <span class="sort">facebook</span></li>
</ul>

如果数组是 ["ios","android"] 那么“android”将在“ios”之前和“facebook”之后,因为“facebook”不在数组中:

<ul id="appsList">
   <li><span>aa</span>  <span class="sort">android</span></li>
   <li><span>bb</span>  <span class="sort">android</span></li>
   <li><span>aa</span>  <span class="sort">ios</span></li>
   <li><span>bb</span>  <span class="sort">ios</span></li>
   <li><span>aa</span>  <span class="sort">facebook</span></li>
   <li><span>bb</span>  <span class="sort">facebook</span></li>
</ul>

这是我到目前为止所做的:PLNKER

如果这可以使用 Underscore 轻松完成,我会更喜欢。 谢谢。

最佳答案

您需要通过过滤和排序来分解任务。然后合并两个结果。

Plunker Demo

 var arr = ["ios"];
 var $li = $('#appsList li').clone();
 var mySort = function(a, b) {
        var objA = {
            "span": $(a).find('span').not('.sort').text(),
            "sort": $(a).find('.sort').text()
        }
        var objB = {
            "span": $(b).find('span').not('.sort').text(),
            "sort": $(b).find('.sort').text()
        }
        output = objA.sort.localeCompare(objB.sort);
        if (objA.sort === objB.sort) {
            output = objA.span.localeCompare(objB.span);
        }
        return output
    } // mySort
 // Filter for what's in your array
 var arrFilter = function(index, el) {
    return arr.indexOf($(el).find('.sort').text()) > -1;
 }

 // Filter for what's not in your array
 var notArrFilter = function(index, el) {
    return arr.indexOf($(el).find('.sort').text()) < 0;
 }
 var $arrLi = $li.filter(arrFilter);
 var $notArrLi = $li.filter(notArrFilter);
 $arrLi = $arrLi.sort(mySort);
 $notArrLi = $notArrLi.sort(mySort);
 var $newLi = [];
 $.merge($newLi, $arrLi);
 $.merge($newLi, $notArrLi);
 $('#resultAppsList').html($newLi);

关于javascript - jQuery 或下划线按跨度文本对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247204/

相关文章:

javascript - .has() 函数在 if 语句中不起作用 (jQuery)

javascript - Azure API 管理 > CORS 和 POST

javascript - 使用 javascript 记录和检索 html 元素/节点路径

javascript - 在 JSZip 中打包外部文件

javascript - 单击单独的 div 取消动画状态

javascript - lodash:使用值数组过滤集合

meteor - 将 Meteor 的 Underscore 升级到 1.7.0 是否安全?

javascript - javascript中函数没有得到预期的返回值

javascript - 设计一个 7 列的周计划,水平滚动

javascript - 使用 debounce 监听多个范围的值变化