3

我有一个这样的列表:

<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 做到这一点吗?

4

3 回答 3

6

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/

于 2012-08-06T15:49:50.690 回答
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/

于 2017-01-17T19:49:56.077 回答
0

我正在寻找类似的东西,我想以字母顺序分组的方式对数组进行排序。这是我的代码,它是@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/

于 2015-05-12T11:55:48.153 回答