2015-01-08 5 views
4

데이터 속성 값을 사용하여 사전 순으로 html div를 정렬하려고합니다. 나는 다음과 같은 코드를 가지고 알고 싶다, 어떻게 이것이 데이터 속성을 사용하여 알파벳 순서로 div 정렬

<div id="aphaOrder"> 
    <div class="value" data-site="olark">olark</div> 
    <div class="value" data-site="snapengage">snapengage</div> 
    <div class="value" data-site="helponclick">helponclick</div> 
    <div class="value" data-site="hangouts">hangouts</div> 
    <div class="value" data-site="atlass">atlass</div> 
    <div class="value" data-site="hipchat">hipchat</div> 
    <div class="value" data-site="chat hip">chat hip</div> 
    <div class="value" data-site="force">force</div> 
    <div class="value" data-site="sugar sms">sugar sms</div> 
    <div class="value" data-site="capsule">capsule</div> 
    <div class="value" data-site="highrise">highrise</div> 
    <div class="value" data-site="nimble">nimble</div> 
    <div class="value" data-site="batch">batch</div> 
    <div class="value" data-site="book crm">book crm</div> 
    <div class="value" data-site="solve">solve</div> 
    <div class="value" data-site="insightly">insightly</div> 
    <div class="value" data-site="pipeliner">pipeliner</div> 
    <div class="value" data-site="shopify">shopify</div> 
    <div class="value" data-site="wordpress">wordpress</div> 
    <div class="value" data-site="Magento">Magento</div> 
</div> 
var alphabeticallyOrderedDivs = $('.value').sort(function(a,b){ 
    return $(a).attr('data-site') > $(b).attr('data-site'); 
}); 
$("#aphaOrder").html(alphabeticallyOrderedDivs); 

을 달성 할 수있다이 코드는 올바른 결과를 포기하지 않을이다. 이걸 도와주세요.

+0

는 비교 함수는 숫자가 아닌 부울을 반환하기로되어있다. 답장을 보내 주셔서 감사합니다. – Barmar

답변

10

당신은이 내림차순으로 정렬 할 수있는 옵션을 포함하는 수정 된 버전입니다 String.prototype.localeCompare

JSFIDDLE here


var alphabeticallyOrderedDivs = $('.value').sort(function(a, b) { 
    return String.prototype.localeCompare.call($(a).data('site').toLowerCase(), $(b).data('site').toLowerCase()); 
}); 

var container = $("#aphaOrder"); 
container.detach().empty().append(alphabeticallyOrderedDivs); 
$('body').append(container); 
1

당신은 속성 data-value을 얻는 것을 시도하고있다. 그런 재산은 없습니다. JSFIDDLE

이 시도 체크 :

return $(a).data('site').toLowerCase() > $(b).data('site').toLowerCase(); 

또는

return $(a).attr('data-site').toLowerCase() > $(b).attr('data-site').toLowerCase(); 

출력은 다음과 같습니다

atlass 
batch 
book crm 
capsule 
chat hip 
force 
hangouts 
... 
+0

출력은 알파벳순이 아니 었습니다 – Dedrik

+0

??? 내 자필 확인 했니? 그건 완전히 알파벳순입니다. 그게 아닌가? – vaso123

+0

pls [http://i61.tinypic.com/o70ymd.png] 링크를 참조하십시오. jsfiddle에서 첫 번째 div는 '

highrise
'입니다. ** atlass ** div가 먼저 표시되지 않습니다. – Dedrik

1

이 작동합니다 : -

 $("#aphaOrder .value").sort(function (a, b) { 
      if (($(a).attr("data-site").toLowerCase() > $(b).attr("data-site").toLowerCase())) { 
       return 1; 
      } else if (($(a).attr("data-site").toLowerCase() == $(b).attr("data-site").toLowerCase())){ 
       return 0; 
      } else { 
       return -1; 
      } 
     }).each(function() { 
      var elem = $(this); 
      elem.remove(); 
      $(elem).appendTo("#aphaOrder"); 
     }); 

http://jsfiddle.net/0bs5mu6e/2/

+0

. 출력은 알파벳순이 아님 – Dedrik

+0

편집을 참조하십시오. 비교 함수는 부울이 아닌 숫자를 반환합니다. 이전 코드는 firefox에서는 제대로 작동하지만 크롬에서는 제대로 작동하지 않습니다. 이것은 둘 다에서 작동해야합니다. –

+0

대단히 감사합니다. – Dedrik

0

사용할 수 있습니다.

var alphaOrder = function(sortDescending){ 
var $container = $('section.grid'), 
    $containerInner = $container.find('> ul'), 
    alphaOrder = $container.find('li').sort(function(a, b) { 
     // return String.prototype.localeCompare.call($(a).data('name').toLowerCase(), $(b).data('name').toLowerCase()); 
      var an = a.getAttribute('data-name'), 
       bn = b.getAttribute('data-name'), 
       pos = sortDescending ? -1 : 1, 
       neg = sortDescending ? 1 : -1; 

      if(an > bn) { return pos; } 
      if(an < bn) { return neg; } 
      return 0; 
    }); 
    // console.log(typeof alphaOrder); 
$containerInner.detach().empty().append(alphaOrder); 
$container.append($containerInner); 

}

관련 문제