Tôi đang tìm cách tự làm điều này và tôi không hài lòng với bất kỳ câu trả lời nào được cung cấp đơn giản bởi vì, tôi tin rằng, chúng là thời gian bậc hai, và tôi cần phải làm điều này trong danh sách hàng trăm mục dài.
Tôi đã kết thúc việc mở rộng jquery và giải pháp của tôi sử dụng jquery, nhưng có thể dễ dàng được sửa đổi để sử dụng javascript thẳng.
Tôi chỉ truy cập mỗi mục hai lần và thực hiện một loại tuyến tính, do đó, tôi nghĩ rằng, việc này sẽ nhanh hơn rất nhiều trên các tập dữ liệu lớn, mặc dù tôi tự do thú nhận rằng tôi có thể bị nhầm lẫn ở đó:
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)));
}
}