2012-09-04 80 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