2012-09-04 39 views
2

我正在使用this question中的函数来使用jQuery对表中的行进行整理。我真正想要的是仅洗牌的第一列,剩下的也不放过,这样的:我怎样才能洗牌一张桌子的第一列?

a b c d 
e f g h 
i j 

要这样:

e b c d 
i f g h 
a j 

Rob W's answer的功能是:

(function($){ 
    //Shuffle all rows, while keeping the first column 
    //Requires: Shuffle 
$.fn.shuffleRows = function(){ 
    return this.each(function(){ 
     var main = $(/table/i.test(this.tagName) ? this.tBodies[0] : this); 
     var firstElem = [], counter=0; 
     main.children().each(function(){ 
      firstElem.push(this.firstChild); 
     }); 
     main.shuffle(); 
     main.children().each(function(){ 
      this.insertBefore(firstElem[counter++], this.firstChild); 
     }); 
    }); 
    } 
    /* Shuffle is required */ 
    $.fn.shuffle = function() { 
    return this.each(function(){ 
     var items = $(this).children(); 
     return (items.length) 
     ? $(this).html($.shuffle(items)) 
     : this; 
    }); 
    } 

    $.shuffle = function(arr) { 
    for(
     var j, x, i = arr.length; i; 
     j = parseInt(Math.random() * i), 
     x = arr[--i], arr[i] = arr[j], arr[j] = x 
    ); 
    return arr; 
    } 
})(jQuery) 

但这与我想要的相反 - 它将所有行洗牌第一栏。我怎样才能改变这个让它洗牌只有第一列?

回答

2

这就是我想出了:

var $firstCells = $("#tableIdHere tr td:first-child"), 
    $copies = $firstCells.clone(true); 

[].sort.call($copies, function() { return Math.random() - 0.5; }); 

$copies.each(function(i){ 
    $firstCells.eq(i).replaceWith(this); 
}); 

也就是说,选择使用:first-child selector所有第一细胞,使它们的副本,副本随机排序。然后循环访问(现在是随机的)副本,并用它们替换原件。

演示:http://jsfiddle.net/nnnnnn/ceTmL/

附:请注意,如果您只更改了创建$firstCells jQuery对象的选择器,例如,如果将选择器更改为"#tableIdHere tr",它将随机地对进行排序,此技术将随机排序任意表格单元格或元素的集合。

UPDATE:

“我无法理解[]做什么?”

JavaScript数组具有.sort() method,允许你在像我上面所使用的一个自定义排序比较函数通过返回-0.5和0.5之间的随机数以随机顺序进行排序。但jQuery对象不是数组,所以你不能只在$copies jQuery对象上说$copies.sort(...)。然而,jQuery对象是类似于数组,因为它们具有数字索引元素和length属性,如果使用.call().apply()方法调用它们,则可以在类似数组的对象上调用某些数组方法(包括.sort())。我可能已经说:

Array.prototype.sort.call($copies, ... 

...而是我先易后难去键入:

[].sort.call($copies, ... 

...其中[]只是一个空数组,它是有目的仅仅是为了获得到数组.sort()的方法。该排序将应用于作为.call的第一个参数的对象,而不应用于空数组。

+0

谢谢!顺便说一句,我不明白[]做什么? –

+0

回答更新了为什么'[] .sort.call($ copies,...)'对'$ copies' jQuery对象进行排序的简要解释。 (另外,如果你想得到的答案是你所链接的代码的修改版本,但是这段代码看起来太长而且很复杂,因为我认为它应该是一个相当简单的操作,所以我忽略了它。) – nnnnnn