Javascript 这种排序是否可以变得更加优雅/递归

Javascript 这种排序是否可以变得更加优雅/递归,javascript,jquery,algorithm,sorting,Javascript,Jquery,Algorithm,Sorting,我有一个表格,需要按几列排序——比如说音乐,按流派排序,然后按艺术家、专辑等排序。也可以按艺术家/专辑/曲目进行排序。这是我在jquery中想到的: function tableSort (by) { var mylist = $('#mainList');

我有一个表格,需要按几列排序——比如说音乐,按流派排序,然后按艺术家、专辑等排序。也可以按艺术家/专辑/曲目进行排序。这是我在jquery中想到的:

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)