我怎样才能将桌子的第一列洗牌?

时间:2012-09-04 06:40:43

标签: jquery shuffle

我正在使用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)

但是这与我想要的相反 - 它将所有行洗牌但第一列。如何更改此选项以便仅将 第一列改为?

1 个答案:

答案 0 :(得分: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/

P.S。请注意,如果您只是更改创建$firstCells jQuery对象的选择器,此技术将随机排序任何表格单元格或元素集合,例如,如果您将选择器更改为"#tableIdHere tr",它将随机排序< EM>行

更新:

  

“我无法理解 [] 的作用?”

JavaScript数组有.sort() method,允许您传入自定义排序比较函数,就像我上面使用的那样,它返回-0.5和+0.5之间的随机数,以便按随机顺序排序。但是jQuery对象不是数组,所以你不能只在$copies.sort(...) jQuery对象上说$copies。但是,jQuery对象与类似数组,因为它们具有数字索引元素和length属性,并且可以在类数组对象上调用某些数组方法(包括.sort())如果您使用.call().apply()方法来调用它们。我可以说:

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

...但我更容易输入:

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

...其中[]只是一个空数组,仅用于提供对数组.sort()方法的访问。排序将应用于作为.call的第一个参数的对象,而不是空数组。