http://jsfiddle.net/rJe2U/1/を参照してください
var desc = true,
weight_index = [],
table_matrics = [1, 2, 3],
tb=document.getElementById('tb'),
rowsCollection=tb.rows,
rows=[];
try{
rows=Array.prototype.slice.call(rowsCollection,0);
}catch(e){
for(var i=0,l=rowsCollection.length;i<l;i++){
rows.push(rowsCollection[i]);
}
}
table_matrics.sort(function(a, b){
var weight;
if(a == b){
weight = 0;
}else{
weight = (desc ? a > b : a < b) ? -1 : 1;
}
weight_index.push(weight);
if(weight>0){
tb.insertBefore(rows[b-1], rows[a-1])
}else if(weight<0){
tb.insertBefore(rows[a-1], rows[b-1])
}
return weight;
});
http://jsperf.com/sorting-table-rows-with-known-row-weightによると、パフォーマンスは約 41,000 ops/秒 (12,300 ops/300ms) であるため、コードよりも少し高速です。
編集:
上記のコードは簡略化できます (http://jsfiddle.net/rJe2U/2/):
var desc = true,
weight_index = [],
table_matrics = [1, 2, 3],
tb=document.getElementById('tb'),
rows=[];
try{
rows=Array.prototype.slice.call(tb.rows,0);
}catch(e){
for(var i=0,rowsCollection=tb.rows,l=rowsCollection.length;i<l;i++){
rows.push(rowsCollection[i]);
}
}
table_matrics.sort(function(a, b){
var weight;
if(a == b){
weight = 0;
}else{
if(desc ? a > b : a < b){
weight=-1;
tb.insertBefore(rows[a-1], rows[b-1]);
}else{
weight=1;
tb.insertBefore(rows[b-1], rows[a-1]);
}
}
weight_index.push(weight);
return weight;
});
そして、必要ないweight_index
ので、削除できます(http://jsfiddle.net/rJe2U/3/):
var desc = true,
table_matrics = [1, 2, 3],
tb=document.getElementById('tb'),
rows=[];
try{
rows=Array.prototype.slice.call(tb.rows,0);
}catch(e){
for(var i=0,rowsCollection=tb.rows,l=rowsCollection.length;i<l;i++){
rows.push(rowsCollection[i]);
}
}
table_matrics.sort(function(a, b){
var weight;
if(a == b){
return 0;
}
if(desc ? a > b : a < b){
tb.insertBefore(rows[a-1], rows[b-1]);
return -1;
}
tb.insertBefore(rows[b-1], rows[a-1]);
return 1;
});
パフォーマンスは向上していないようですが ( http://jsperf.com/sorting-table-rows-with-known-row-weight/3 )、大量の行では向上すると思います。