我正在使用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)
但是这与我想要的相反 - 它将所有行洗牌但第一列。如何更改此选项以便仅将 第一列改为?
答案 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
的第一个参数的对象,而不是空数组。