Вход

Просмотр полной версии : Сортировка в столбцах таблицы


vkhacker
03.03.2015, 14:57
Здравствуйте!
Сделал сортировку в таблице по столбцам. Сортировка должна выполняться не по содержимому, а только по классу (но не по имени класса). Классов может быть несколько.
Что не устроило меня, так это скорость выполнения. Моя таблица, где около 40 строк и 7 столбцов "сортируется" порядка 5 секунд. Помогите, пожалуйста, оптимизировать.

Код здесь (http://jsfiddle.net/of9voz92/)

рони
03.03.2015, 16:44
vkhacker,
1 строка я так понял в сортировке не учавствует , в данном варианте с небольшим дополнением можно все классы для сортировки задать одновременно.
<!DOCTYPE HTML>

<html>

<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
body{font-size: 20pt;}
table{
margin:0;
padding:0;
border:1px solid #888;
}
td.nd{
color:#0f0;
}
td.nd2{
color:#f00;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function() {
jQuery.fn.tdData = function(td_class) {
return this.each(function() {
var cls = this.className.split(/\s+/),
sum = 0;
for (var i = 0; i < cls.length; i++) sum += cls[i] == td_class ? 1 : 0;
$(this).data({
"cls": sum
})
})
};

function DownCell(table, td_class) {
var row = table.find("tr:gt(0)");
var colcount = row[0].cells.length;
$("td", row).tdData(td_class);
for (var col = 0; col < colcount; col++) {
var cell = row.find("td:nth-child(1)");
var arr = $.makeArray(cell);
arr.sort(function(a, b) {
return $(a).data("cls") - $(b).data("cls")
});
row.each(function(indx, element) {
this.appendChild(arr[indx])
})
}
return false
}
setTimeout(function() {
DownCell($("table.tbl"), "nd");
DownCell($("table.tbl"), "nd2")
}, 2E3)
});
</script>
</head>

<body>
<table class="tbl" cellspacing="0" cellpadding="0" border="1">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
</tr>
<tr>
<td>11</td>
<td>12</td>
<td class="nd2">13</td>
<td>14</td>
<td>15</td>
<td>16</td>
<td class="nd2">17</td>
</tr>
<tr>
<td class="nd2">21</td>
<td class="nd">22</td>
<td>23</td>
<td class="nd">24</td>
<td>25</td>
<td class="nd2">26</td>
<td>27</td>
</tr>
<tr>
<td>31</td>
<td class="nd2">32</td>
<td class="nd">33</td>
<td>34</td>
<td>35</td>
<td class="nd2">36</td>
<td>37</td>
</tr>
</table>
</body>

</html>

рони
03.03.2015, 16:53
vkhacker,
Вариант сортировки по всем классам сразу
<!DOCTYPE HTML>

<html>

<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
body{font-size: 20pt;}
table{
margin:0;
padding:0;
border:1px solid #888;
}
td.nd{
color:#0f0;
}
td.nd2{
color:#f00;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function() {
jQuery.fn.tdData = function(td_class) {
return this.each(function() {
var cls = this.className.split(/\s+/),
sum = 0;
for (var i = 0; i < cls.length; i++) sum += td_class[cls[i]] ? td_class[cls[i]] : 0;
$(this).data({
"cls": sum
})
})
};

function DownCell(table, td_class) {
var row = table.find("tr:gt(0)");
var colcount = row[0].cells.length;
$("td", row).tdData(td_class);
for (var col = 0; col < colcount; col++) {
var cell = row.find("td:nth-child(1)");
var arr = $.makeArray(cell);
arr.sort(function(a, b) {
return $(a).data("cls") - $(b).data("cls")
});
row.each(function(indx, element) {
this.appendChild(arr[indx])
})
}
return false
}

DownCell($("table.tbl"), {"nd" : 1, "nd2" : 2});

});
</script>
</head>

<body>
<table class="tbl" cellspacing="0" cellpadding="0" border="1">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
</tr>
<tr>
<td>11</td>
<td>12</td>
<td class="nd2">13</td>
<td>14</td>
<td>15</td>
<td>16</td>
<td class="nd2">17</td>
</tr>
<tr>
<td class="nd2">21</td>
<td class="nd">22</td>
<td>23</td>
<td class="nd">24</td>
<td>25</td>
<td class="nd2">26</td>
<td>27</td>
</tr>
<tr>
<td>31</td>
<td class="nd2">32</td>
<td class="nd">33</td>
<td>34</td>
<td>35</td>
<td class="nd2">36</td>
<td>37</td>
</tr>
</table>
</body>

</html>

vkhacker
04.03.2015, 08:21
Спасибо! То, что нужно!

vkhacker
06.03.2015, 08:57
рони,
почему-то в Google Chrome другой результат
Ссылка на код (http://jsfiddle.net/9gugafop/)



Решил проблему следующим образом:
arr.sort(function(a, b) {
var res = $(a).data("cls") - $(b).data("cls");
if (res==0){
if ($(a).text() > $(b).text()) return 1;
if ($(a).text() < $(b).text()) return -1;
return 0;
}
else
return res;
});
Результат (http://jsfiddle.net/9gugafop/1/)
Работает в случае, если требуется сортировка содержимого текста по алфавиту.

рони
06.03.2015, 11:13
vkhacker,
Google так оптимизировал сортировку -
http://jsfiddle.net/9gugafop/2/
строка 27 добавлена сортировка по содержимому