【问题标题】:Lists alphabetical ordered by javascript with letter headings列出由 javascript 按字母顺序排列的带有字母标题的列表
【发布时间】:2012-08-06 14:36:54
【问题描述】:

我有一个这样的列表:

<ul id="list">
    <li><a href="/">Adam</a></li>
    <li><a href="/">Alex</a></li>
    ...
    <li><a href="/">Zara</a></li>            
</ul>

而且它已经按这个 JavaScript 的字母顺序排列了:

var mylist = $('#list');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
    return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });

现在我需要像这样设置列表:

<ul id="list">
    <li id="a"><a name="a" class="title">A</a>
        <ul>
            <li><a href="/">Adam</a></li>
            <li><a href="/">Alex</a></li>
        </ul>
    </li>
    <li id="b"><a name="b" class="title">B</a>
        <ul>
            <li><a href="/">Barry</a></li>
            <li><a href="/">Becky</a></li>
        </ul>
    </li>
    ...
    ...
    ...
    <li id="z"><a name="z" class="title">z</a>
        <ul>
            <li><a href="/">zavv</a></li>
            <li><a href="/">zora</a></li>
        </ul>
    </li>
</ul>

要使用此Apple Style Slider 中的列表。

你知道我如何使用 JavaScript 来做到这一点吗?

【问题讨论】:

    标签: javascript list sql-order-by alphabetical


    【解决方案1】:

    首先收集对象中的所有li 元素(按其内容的首字母分类)然后分别对这些列表进行排序是最简单的(我猜)。由于代码说了一千多个单词,我会这样做:

    var list = { letters: [] };    //object to collect the li elements and a list of initial letters
    $("#list").children("li").each(function(){
        var itmLetter = $(this).text().substring(0,1).toUpperCase();
        if (!(itmLetter in list)) {
            list[itmLetter] = [];
            list.letters.push(itmLetter);
        }
        list[itmLetter].push($(this));    //add li element to the letter's array in the list object
    });
    
    list.letters.sort();    //sort all available letters to iterate over them
    $.each(list.letters, function(i, letter){
        list[letter].sort(function(a, b) {
            return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());    //sort li elements of one letter
        });
        var ul = $("<ul/>");    //create new dom element and add li elements
        $.each(list[letter], function(idx, itm){
            ul.append(itm);
        });
        $("#list").append($("<li/>").append($("<a/>").attr("name", letter.toLowerCase()).addClass("title").html(letter)).append(ul));    //add the list to a new li and to #list ul
    });
    

    JSFiddle:http://jsfiddle.net/KnC6M/

    【讨论】:

    • 它就像一个魅力!太感谢了!!!你救了我 ;) 为 Aletheios 竖起大拇指!!!只有一个问题:你为什么使用 $("#list").empty(); ?
    • 很高兴它对您有用。也许您可以接受我的回答...(上面的小复选标记);)$("#list").empty()&lt;ul id="list"&gt; 中删除原始li 元素,以便添加新生成的项目。
    • 好,我想。该行导致我的脚本出现错误..列表元素内的链接不起作用(它是在自定义谷歌地图中更改位置而不重新加载页面的链接)。如果我删除该行,一切正常。你认为没有这条线会造成一些问题吗?
    • 只是猜测,但这可能与事件处理程序有关...但我只是注意到脚本在没有该行的情况下也可以正常工作(不要问我为什么)-我在上面更正了.
    【解决方案2】:

    感谢@Aletheios,我更新了您的解决方案,使用css 使其更高效,而无需删除$("#list").empty(); 的列表

    假设您的列表已经排序。

    var letters = [];
    
    $("#list").children("li").each(function(i){
        var itmLetter = $(this).text().trim().substring(0,1).toUpperCase();
        if (letters.indexOf(itmLetter)<0) {
            console.log(`${itmLetter} is not in ${letters} and index is ${i}`);
            $(`#list li:nth-child(${i+1})`).addClass("AddContent").attr('data-content',itmLetter);
            letters.push(itmLetter);
        } else {
            console.log(`${itmLetter} is in ${letters}`);
        }
    });
    

    CSS:

    #list{
      margin-left: 15px;
    }
    
    li.AddContent:before {
       content: attr(data-content);
       margin-left: -15px;
       display: block;
    }
    

    HTML:

      <ul id="list">
          <li><a href="/">    Zara</a></li>
          <li><a href="/">    Adam</a></li>
          <li><a href="/">   Alex</a></li>            
          <li><a href="/">   Toby</a></li>
      </ul>
    

    JSfiddle:http://jsfiddle.net/KnC6M/105/

    【讨论】:

      【解决方案3】:

      我正在寻找类似的东西,我想按字母顺序对数组进行排序。这是我的代码,它是@Aletheios 代码的小修改版本。希望对您有所帮助。

      var list = { letters: [] };
      var words = {let: ['abc', 'aabbgg', 'cda', 'hello', 'bca']};
      
      $.each(words.let, function(){                
          var itLetter = this.substring(0,1).toUpperCase();
          if(!(itLetter in list)){
              list[itLetter] = [];                    
              list.letters.push(itLetter);
          }
          list[itLetter].push($(this));
      });
      
      list.letters.sort();
      $.each(list.letters, function(i, letter){
      
          var ul = $("<ul/>");
          var li = $('<li/>');
          $.each(list[letter], function(idx, itm){
              ul.append('<li>'+ itm[0] +'</li>');
              console.log(itm);
      
          });
          $("body").append($("<li/>").append($("<a/>").attr("name", letter.toLowerCase()).addClass("title").html(letter)).append(ul));
      });
      

      这是小提琴。 http://jsfiddle.net/checkomkar/x8taqcnk/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        相关资源
        最近更新 更多