Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.11.2011, 17:57
Аспирант
Отправить личное сообщение для formus Посмотреть профиль Найти все сообщения от formus
 
Регистрация: 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>
Ответить с цитированием
  #2 (permalink)  
Старый 17.11.2011, 18:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

formus,
Потому что вы сортируите строки а не числа!!!
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2011, 19:11
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2011, 20:31
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Почитать не?

arr= [40, 2, 25, 15, 1, 20];
alert(arr.sort(function(a, b){return a-b}));
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2011, 10:57
Аспирант
Отправить личное сообщение для formus Посмотреть профиль Найти все сообщения от formus
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 18.11.2011, 11:09
Аспирант
Отправить личное сообщение для formus Посмотреть профиль Найти все сообщения от formus
 
Регистрация: 16.10.2010
Сообщений: 34

Да, это простейшая сортировка - можно попробовать связать ее с моим скриптом...Но я думаю легче добавить пару слов в сам скрипт.Например преобразовать строки в числа - щас буду пробовать.
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2011, 11:12
Аспирант
Отправить личное сообщение для formus Посмотреть профиль Найти все сообщения от formus
 
Регистрация: 16.10.2010
Сообщений: 34

Буду пробовать parseFloatом, спасибо
Ответить с цитированием
  #8 (permalink)  
Старый 18.11.2011, 15:58
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от formus
Да, это простейшая сортировка - можно попробовать связать ее с моим скриптом...Но я думаю легче добавить пару слов в сам скрипт.Например преобразовать строки в числа - щас буду пробовать.
Дурной, штоле? Array.sort плевать на тип данных, который у тебя - всё приводится к строке и сравнивается посимвольно.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #9 (permalink)  
Старый 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>
Ответить с цитированием
  #10 (permalink)  
Старый 19.11.2011, 01:48
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

рони, вы правы, пожалуй... Невнимательно прочёл его сообщение)

Ну, я тоже человек)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программист JavaScript постоянная удалённая работа. moisha Работа 4 26.10.2011 19:52
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06
Работа с дробными числами vah-smile Элементы интерфейса 2 09.11.2010 12:15
jqgrid некоректная работа "родных" кнопок навигации skalka jQuery 0 06.10.2010 11:31
Работа с дробными числами DMH Общие вопросы Javascript 5 23.08.2010 13:49