17.11.2011, 17:57
|
Аспирант
|
|
Регистрация: 16.10.2010
Сообщений: 34
|
|
Сортировка. Некоректная работа с числами
Привет всем! Скрипт сортирует по значению одного из <li>.
Все ок если значения однозначны - т.е. 4,1,5,8, но когда например 4,10,5,8 – скрипт работает не корректно.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='ru-RU'>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript">
var $A = function(iterable) {
if (iterable) {
var result = [], i = iterable.length;
while (i) result[--i] = iterable[i];
return result;
}
return [];
};
function parse(sortWhat,width,what) {
var ul = document.getElementById(sortWhat).getElementsByTag Name('ul')[0],
arr = $A(ul.getElementsByTagName('li'));
var size = arr.length/width;
var newArr = new Array (size);
for (var i = 0; i<size; i++) {
newArr[i] = new Array(width);
}
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
newArr[i][j] = arr[i*width+j];
}
}
newArr.sort(function(i, ii) {
i = i[what].innerHTML.toLowerCase();
ii = ii[what].innerHTML.toLowerCase();
if (i > ii)
return 1;
else if (i < ii)
return -1;
else
return 0;
});
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
ul.appendChild(newArr[i][j]);
}
}
return false;
}
</script>
</head>
<body>
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,0);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,1);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,2);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,3);" />
<div id="sort">
<ul>
<li>Л</li>
<li>34</li>
<li>200 </li>
<li>1111f</li>
<li>К</li>
<li>10</li>
<li>10 </li>
<li>3333f</li>
<li>П</li>
<li>23</li>
<li>300 </li>
<li>2222f</li>
</ul>
</div>
</body>
</html>
|
|
17.11.2011, 18:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
formus,
Потому что вы сортируите строки а не числа!!!
|
|
17.11.2011, 19:11
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|
17.11.2011, 20:31
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Почитать не?
arr= [40, 2, 25, 15, 1, 20];
alert(arr.sort(function(a, b){return a-b}));
|
|
18.11.2011, 10:57
|
Аспирант
|
|
Регистрация: 16.10.2010
Сообщений: 34
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='ru-RU'>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
var $A = function(iterable) {
if (iterable) {
var result = [], i = iterable.length;
while (i) result[--i] = iterable[i];
return result;
}
return [];
};
function parse(sortWhat,width,what) {
var ul = document.getElementById(sortWhat).getElementsByTagName('ul')[0],
arr = $A(ul.getElementsByTagName('li'));
var size = arr.length/width;
var newArr = new Array (size);
for (var i = 0; i<size; i++) {
newArr[i] = new Array(width);
}
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
newArr[i][j] = arr[i*width+j];
}
}
newArr.sort(function(i, ii) {
i = i[what].innerHTML.toLowerCase();
ii = ii[what].innerHTML.toLowerCase();
if (i > ii)
return 1;
else if (i < ii)
return -1;
else
return 0;
});
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
ul.appendChild(newArr[i][j]);
}
}
return false;
}
</head>
<body>
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,0);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,1);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,2);" />
<input type="button" value="Сортировать(возрастани е)" onclick="parse('sort',4,3);" />
<div id="sort">
<ul>
<li>Л</li>
<li>34</li>
<li>200 </li>
<li>1111f</li>
<li>К</li>
<li>10</li>
<li>10 </li>
<li>3333f</li>
<li>П</li>
<li>23</li>
<li>300 </li>
<li>2222f</li>
</ul>
</div>
</body>
</html>
Последний раз редактировалось formus, 18.11.2011 в 11:00.
|
|
18.11.2011, 11:09
|
Аспирант
|
|
Регистрация: 16.10.2010
Сообщений: 34
|
|
Да, это простейшая сортировка - можно попробовать связать ее с моим скриптом...Но я думаю легче добавить пару слов в сам скрипт.Например преобразовать строки в числа - щас буду пробовать.
|
|
18.11.2011, 11:12
|
Аспирант
|
|
Регистрация: 16.10.2010
Сообщений: 34
|
|
Буду пробовать parseFloatом, спасибо
|
|
18.11.2011, 15:58
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от formus
|
Да, это простейшая сортировка - можно попробовать связать ее с моим скриптом...Но я думаю легче добавить пару слов в сам скрипт.Например преобразовать строки в числа - щас буду пробовать.
|
Дурной, штоле? Array.sort плевать на тип данных, который у тебя - всё приводится к строке и сравнивается посимвольно.
|
|
19.11.2011, 01:29
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
trikadin,
formus,верно понял свою проблему и нашёл решение ... имхо минус ему поставлен незаслуженно ... ниже возможный вариант ... строки преобразуются в число при сортировке если это возможно или остаются строкой если это невозможно ... строки 29-30
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='ru-RU'>
<head>
<script type="text/javascript">
var $A = function(iterable) {
if (iterable) {
var result = [], i = iterable.length;
while (i) result[--i] = iterable[i];
return result;
}
return [];
};
function parse(sortWhat,width,what) {
var ul = document.getElementById(sortWhat).getElementsByTagName('ul')[0],
arr = $A(ul.getElementsByTagName('li'));
var size = arr.length/width;
var newArr = new Array (size);
for (var i = 0; i<size; i++) {
newArr[i] = new Array(width);
}
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
newArr[i][j] = arr[i*width+j];
}
}
newArr.sort(function(i, ii) {
i = i[what].innerHTML.toLowerCase();
ii = ii[what].innerHTML.toLowerCase();
i=parseFloat(i)||i;
ii=parseFloat(ii)||ii;
if (i > ii)
return 1;
else if (i < ii)
return -1;
else
return 0;
});
for (var i = 0; i<size; i++) {
for (var j = 0; j<width; j++) {
ul.appendChild(newArr[i][j]);
}
}
return false;
}
</script>
</head>
<body>
<input type="button" value="Сортировать(возрастание)" onclick="parse('sort',4,0);" />
<input type="button" value="Сортировать(возрастание)" onclick="parse('sort',4,1);" />
<input type="button" value="Сортировать(возрастание)" onclick="parse('sort',4,2);" />
<input type="button" value="Сортировать(возрастание)" onclick="parse('sort',4,3);" />
<div id="sort">
<ul>
<li>Л</li>
<li>34</li>
<li>200 </li>
<li>1111f</li>
<li>К</li>
<li>10</li>
<li>10 </li>
<li>3333f</li>
<li>П</li>
<li>23</li>
<li>300 </li>
<li>2222f</li>
</ul>
</div>
</body>
</html>
|
|
19.11.2011, 01:48
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
рони, вы правы, пожалуй... Невнимательно прочёл его сообщение)
Ну, я тоже человек)
|
|
|
|