Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Помогите с сортировкой (https://javascript.ru/forum/dom-window/42345-pomogite-s-sortirovkojj.html)

cha0s 22.10.2013 21:54

Помогите с сортировкой
 
Имеется такой контент

<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-рым цифрам после запятой и т.д, но что-то его клинет, с целыми числами все ок получается, но у меня задача что надо разобрать строки... помогите люди добрые для кого такая задача элементарная:)

cha0s 22.10.2013 23:26

а вроде сделал))

Проверьте хотя-бы сойдет или нет)

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);


Получается что сделал просто если в строке нету запятой, то я преобразовываю к числу и все, а остальное уже за меня реализовано строковые сравнения.... все верно? вроде работает :)

Makarov 22.10.2013 23:35

Цитата:

Сообщение от cha0s (Сообщение 277688)
а остальное уже за меня реализовано строковые сравнения....

так на чем-нибудь вроде '1,2'<'1,12' оно и отработает как любая уважающая себя строка

рони 23.10.2013 00:18

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>

рони 23.10.2013 00:33

если сравнивать как строки
alert('1,20'<'1,8');
20 меньше 8 отлично :dance: ????

cha0s 23.10.2013 00:38

а ну в натуре)) тупал что-то, я и думаю что-то как-то все просто слишком упростилось у меня))) спасиб! буду разбираться:))))


Часовой пояс GMT +3, время: 05:43.