Я искал сделать это сам, и я не был удовлетворен ни одним из ответов, предоставленных просто потому, что, я полагаю, это квадратичное время, и мне нужно сделать это в списках сотен пунктов длиной.
Я закончил расширять jquery, и мое решение использует jquery, но его можно легко изменить, чтобы использовать прямой javascript.
Я только получаю доступ к каждому элементу дважды и выполняю одну линейную сортировку, так что, я думаю, это должно работать намного быстрее на больших наборах данных, хотя я свободно признаюсь, что могу ошибаться там:
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)));
}
}