আমি নিজেই এটি করতে চেয়েছিলাম এবং আমি যে উত্তর সরবরাহ করেছি তা কেবল সন্তুষ্ট ছিলাম না, কারণ আমার বিশ্বাস, এগুলি চতুর্ভুজ সময়, এবং আমার কয়েকশ আইটেম দীর্ঘ তালিকাতে এটি করা দরকার।
আমি jquery প্রসারিত শেষ করেছি, এবং আমার সমাধান jquery ব্যবহার করে , তবে সহজেই সরাসরি জাভাস্ক্রিপ্ট ব্যবহার করার জন্য পরিবর্তন করা যেতে পারে।
আমি কেবল প্রতিটি আইটেম দু'বার অ্যাক্সেস করি এবং একটি লিনিয়ারিথমিক বাছাই করি, সুতরাং আমার মনে হয়, বড় ডেটাসেটগুলিতে খুব দ্রুত কাজ করা উচিত, যদিও আমি নির্দ্বিধায় স্বীকার করি যে আমার ভুল হতে পারে:
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)));
}
}