Saya ingin melakukan ini sendiri, dan saya tidak puas dengan jawaban yang diberikan hanya karena, saya percaya, itu adalah waktu kuadratik, dan saya perlu melakukan ini pada daftar ratusan item.
Saya akhirnya memperluas jquery, dan solusi saya menggunakan jquery, tetapi dapat dengan mudah dimodifikasi untuk menggunakan javascript lurus.
Saya hanya mengakses setiap item dua kali, dan melakukan satu jenis linearitmik, jadi ini seharusnya, saya pikir, bekerja jauh lebih cepat pada kumpulan data besar, meskipun saya dengan bebas mengaku bahwa saya bisa saja salah di sana:
sortList: function() {
if (!this.is("ul") || !this.length)
return
else {
var getData = function(ul) {
var lis = ul.find('li'),
liData = {
liTexts : []
};
for(var i = 0; i<lis.length; i++){
var key = $(lis[i]).text().trim().toLowerCase().replace(/\s/g, ""),
attrs = lis[i].attributes;
liData[key] = {},
liData[key]['attrs'] = {},
liData[key]['html'] = $(lis[i]).html();
liData.liTexts.push(key);
for (var j = 0; j < attrs.length; j++) {
liData[key]['attrs'][attrs[j].nodeName] = attrs[j].nodeValue;
}
}
return liData;
},
processData = function (obj){
var sortedTexts = obj.liTexts.sort(),
htmlStr = '';
for(var i = 0; i < sortedTexts.length; i++){
var attrsStr = '',
attributes = obj[sortedTexts[i]].attrs;
for(attr in attributes){
var str = attr + "=\'" + attributes[attr] + "\' ";
attrsStr += str;
}
htmlStr += "<li "+ attrsStr + ">" + obj[sortedTexts[i]].html+"</li>";
}
return htmlStr;
};
this.html(processData(getData(this)));
}
}