Javascript 这种排序是否可以变得更加优雅/递归
我有一个表格,需要按几列排序——比如说音乐,按流派排序,然后按艺术家、专辑等排序。也可以按艺术家/专辑/曲目进行排序。这是我在jquery中想到的:Javascript 这种排序是否可以变得更加优雅/递归,javascript,jquery,algorithm,sorting,Javascript,Jquery,Algorithm,Sorting,我有一个表格,需要按几列排序——比如说音乐,按流派排序,然后按艺术家、专辑等排序。也可以按艺术家/专辑/曲目进行排序。这是我在jquery中想到的: function tableSort (by) { var mylist = $('#mainList');
function tableSort (by) {
var mylist = $('#mainList');
var listitems = $('.row').get();
listitems.sort(function(a, b) {
var cidA=$(a).attr('id');
var cidB=$(b).attr('id');
var i=[1,2,4,3];
var compA=[];
var compB=[];
compA[0]=$(a).find('.album').html();
compB[0]=$(b).find('.album').html();;
compA[1]=$(a).find('.artist').html();
compB[1]=$(b).find('.artist').html();
compA[2]=$(a).find('.genre').html();
compB[2]=$(b).find('.genre').html();
compA[3]=$(a).find('.track').val();
compB[3]=$(b).find('.track').val();
switch (by) {
case 'genre->artist->album':
i=[2,0,1,3];
break;
case 'genre->album->artist':
i=[2,1,0,3];
break;
default:
compA='';
compB='';
}
var comp=(compA[i[0]] < compB[i[0]]) ? -1 : (compA[i[0]] > compB[i[0]]) ? 1 : 0;
if (comp==0) comp=(compA[i[1]] < compB[i[1]]) ? -1 : (compA[i[1]] > compB[i[1]]) ? 1 : 0;
if (comp==0) comp=(compA[i[2]] < compB[i[2]]) ? -1 : (compA[i[2]] > compB[i[2]]) ? 1 : 0;
if (comp==0) comp=(compA[i[3]] < compB[i[3]]) ? -1 : (compA[i[3]] > compB[i[3]]) ? 1 : 0;
return comp;
});
$.each(listitems, function(i, v) {
var id=$(v).attr('id').split('_')[1];
mylist.append(v);
});
}
函数表排序(by){
var mylist=$('mainList');
var listitems=$('.row').get();
排序(函数(a,b){
变量cidA=$(a).attr('id');
var cidB=$(b).attr('id');
var i=[1,2,4,3];
var compA=[];
var compB=[];
compA[0]=$(a).find('.album').html();
compB[0]=$(b).find('.album').html();;
compA[1]=$(a).find('.artist').html();
compB[1]=$(b).find('.artist').html();
compA[2]=$(a).find('.genre').html();
compB[2]=$(b).find('.genre').html();
compA[3]=$(a).find('.track').val();
compB[3]=$(b).find('.track').val();
开关(由){
案例“流派->艺术家->专辑”:
i=[2,0,1,3];
打破
案例“流派->专辑->艺术家”:
i=[2,1,0,3];
打破
违约:
compA=“”;
compB=“”;
}
变量comp=(compA[i[0]]compB[i[0]])?1:0;
如果(comp==0)comp=(compA[i[1]]compB[i[1]])?1:0;
如果(comp==0)comp=(compA[i[2]]compB[i[2]])?1:0;
如果(comp==0)comp=(compA[i[3]]compB[i[3]])?1:0;
返回补偿;
});
$.each(列表项,函数(i,v){
变量id=$(v).attr('id').split('uu')[1];
mylist.append(v);
});
}
这适用于我的3-4个订单,但必须有一个更优雅和可扩展的方式 如果您不介意使用插件尝试或轻量级如果您不介意使用插件尝试或轻量级未测试,但应该可以使用:
listitems.sort(function(a, b) {
var $a=$(a),$b=$(b),
i=[1,2,4,3],
compA=[],
compB=[],
cols=['album', 'artist', 'genre', 'track'];
for(var c=0; c<cols.length; c++)
{
var fn=cols[c]==="track" ? "val" : "html";
compA.push($a.find("."+cols[c])[fn]());
compB.push($b.find("."+cols[c])[fn]());
}
switch (by) {
case 'genre->artist->album':
i=[2,0,1,3];
break;
case 'genre->album->artist':
i=[2,1,0,3];
break;
/*default:
compA=''; //WHY???
compB='';*/
}
for(c=0; c<i.length; c++)
{
if(compA[i[c]]<compB[i[c]]) return -1;
else if(compA[i[c]]>compB[i[c]]) return 1;
}
return 0;
});
listitems.sort(函数(a,b){
变量$a=$(a),$b=$(b),
i=[1,2,4,3],
compA=[],
compB=[],
cols=[‘专辑’、‘艺术家’、‘流派’、‘曲目’];
对于(var c=0;c未测试,但应能正常工作:
listitems.sort(function(a, b) {
var $a=$(a),$b=$(b),
i=[1,2,4,3],
compA=[],
compB=[],
cols=['album', 'artist', 'genre', 'track'];
for(var c=0; c<cols.length; c++)
{
var fn=cols[c]==="track" ? "val" : "html";
compA.push($a.find("."+cols[c])[fn]());
compB.push($b.find("."+cols[c])[fn]());
}
switch (by) {
case 'genre->artist->album':
i=[2,0,1,3];
break;
case 'genre->album->artist':
i=[2,1,0,3];
break;
/*default:
compA=''; //WHY???
compB='';*/
}
for(c=0; c<i.length; c++)
{
if(compA[i[c]]<compB[i[c]]) return -1;
else if(compA[i[c]]>compB[i[c]]) return 1;
}
return 0;
});
listitems.sort(函数(a,b){
变量$a=$(a),$b=$(b),
i=[1,2,4,3],
compA=[],
compB=[],
cols=[‘专辑’、‘艺术家’、‘流派’、‘曲目’];
对于(var c=0;c,我建议使用类似的插件
一个快速的谷歌搜索显示,我相信它能满足你的所有需求。精简版也只有12kb,所以加载到网站上不是一个大问题。我建议使用插件来实现类似的功能
一个快速的谷歌搜索显示,我相信它能满足你的所有需求。缩小版也只有12kb,所以加载到网站上不是一个大问题。我支持一个插件的建议,该插件可以处理排序并将潜在的bug发现转移到社区。我会想到,但我认为你不会有任何问题选择太少:)我支持一个插件的建议,该插件可以处理排序并将潜在的bug发现转移给社区。我想到了,但我认为选择太少不会有问题:)mck89有一个很好的答案,但我修复了数字排序,并尝试将其清理干净一点():
HTML
排序:
方向:上升下降
顺序:- 专辑-
艺术家-- 流派-
- 曲目-
分类
唱片艺术家
.........#
...
剧本
$(document).ready(function(){
$('.order').sortable({
update: function(e,ui){
$('.order span').show().filter(':last').hide(); // hide last arrow
}
});
$(':button').click(function(){
var table = ['Album', 'Artist', 'Genre', 'Track'],
order = [];
$('.order li').each(function(){
order.push( $.inArray( $(this).text().replace(' ->',''), table ) );
});
tableSort(order, $('.dir').val());
})
})
function tableSort(by,dir){
var mylist = $('#mainList'),
listitems = mylist.find('tbody tr').get();
listitems.sort(function(a, b) {
var $a = $(a),
$b = $(b),
i = by,
compA = [],
compB = [],
c;
for(c=0; c<3; c++){
compA.push($a.find('td').eq(c).html()); // Alphabetical
compB.push($b.find('td').eq(c).html());
}
compA.push(('0' + $a.find('td:last').html()).slice(-2)); // Numerical (2 digit numbers)
compB.push(('0' + $b.find('td:last').html()).slice(-2)); // use '00' + ....slice(-3) for 3 digit numbers, etc...
for(c=0; c<i.length; c++){
return (dir == 'asc') ?
((compA[i[c]] < compB[i[c]]) ? -1 : (compA[i[c]] > compB[i[c]]) ? 1 : 0) : // ascending sort
((compA[i[c]] > compB[i[c]]) ? -1 : (compA[i[c]] < compB[i[c]]) ? 1 : 0) // descending sort
}
});
$.each(listitems, function(i, v) {
mylist.append(v);
});
}
$(文档).ready(f
pad(genre, 20) + pad(album, 100) + pad(artist, 100)