Помогите с сортировкой
Имеется такой контент
<div id="content">
<div position="16">8</div>
<div position="1,1">2</div>
<div position="1">1</div>
<div position="1,5">6</div>
<div position="1,2">3</div>
<div position="1,2,1,1">4</div>
<div position="1,4">5</div>
<div position="2">7</div>
</div>
<div id="results">
</div>
Нужно при помощи JS отсортировать его чтоб блоки расположились так: <div position="1">1</div> <div position="1,1">2</div> <div position="1,2">3</div> <div position="1,2,1,1">4</div> <div position="1,4">5</div> <div position="1,5">6</div> <div position="2">7</div> <div position="16">8</div> То есть сортировка происходит по параметру position, вот мой набросок уже с ним запарился :/
var myArray = $("#content div");
myArray.sort(function (a, b) {
a = $(a).attr("position");
b = $(b).attr("position");
if ((a.split(',').length-1 === 0) && (b.split(',').length-1 === 0)) { // ЕСЛИ ОБА ЧИСЛА ЦЕЛЫЕ, ничего не делаем а приводим к
a = parseInt(a); //типу INT
b = parseInt(b);
}
if ((a.split(',').length-1 !== 0) && (b.split(',').length-1 === 0)) { // если первое не целое а второе целое
posA = a.indexOf(',');
a = parseInt(a.substr(0,posA);
b = parseInt(b);
if (a == b) {a=0;}
}
if((a.split(',').length-1 === 0) && (b.split(',').length-1 !== 0)) { // если первое целое, а второе не целое
posB = b.indexOf(',');
a = parseInt(a);
b = parseInt(b.substr(0,posB));
if (a == b) {b=0;}
}
if(a > b) {
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
});
$("#results").append(myArray);
он еще не закончен под все, то логику я строил такую проверял в значение количество запятых, на этом мог базировать, дальше перестановки, ну то есть если одно число целое, а другое с запятой то мне надо сравнить только первые их цифры, а если они оба дробные типа 1,2 и 1,1 то надо уже сравнить по 2-рым цифрам после запятой и т.д, но что-то его клинет, с целыми числами все ок получается, но у меня задача что надо разобрать строки... помогите люди добрые для кого такая задача элементарная:) |
а вроде сделал))
Проверьте хотя-бы сойдет или нет)
var myArray = $("#content div");
myArray.sort(function (a, b) {
a = $(a).attr("position");
b = $(b).attr("position");
if((a.split(',').length-1 === 0) && (b.split(',').length-1 === 0)) {
a = parseInt(a);
b = parseInt(b);
}
if(a > b) {
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
});
$("#results").append(myArray);
Получается что сделал просто если в строке нету запятой, то я преобразовываю к числу и все, а остальное уже за меня реализовано строковые сравнения.... все верно? вроде работает :) |
Цитата:
|
cha0s,
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
#content{float:left}
#content div:after{content:"→"}
#results span:before{content:"→"}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
$(document)
.ready(function () {
var d = $.makeArray($("#content div"))
.sort(function (b, c) {
b = $(b).attr("position").split(",");
c = $(c).attr("position").split(",");
for (var a = 0; a < b.length; a++) {
if (a == c.length || +b[a] > +c[a]) return 1;
if (+b[a] < +c[a]) return -1
}
return a < c.length ? -1 : 0
});
$("#results")
.append(d.map(function (b, c) {
return $(b).clone().append($('<span/>', {text : $(b).attr("position")}))
}))
});
</script>
</head>
<body>
<div id="content">
<div position="16">8</div>
<div position="1,1">2</div>
<div position="1">1</div>
<div position="1,5">6</div>
<div position="1,2">3</div>
<div position="1,2,1,1">4</div>
<div position="1,4">5</div>
<div position="2">7</div>
</div>
<div id="results">
</div>
</body>
</html>
|
если сравнивать как строки
alert('1,20'<'1,8');
20 меньше 8 отлично :dance: ???? |
а ну в натуре)) тупал что-то, я и думаю что-то как-то все просто слишком упростилось у меня))) спасиб! буду разбираться:))))
|
| Часовой пояс GMT +3, время: 04:20. |