简体   繁体   中英

How to sort divs by 2 data attributes?

How do I modify my code so that it sorts by both data-status and then data-order? ie the desired result is 1,2,3,4

I need to support IE.

 $(document.body).on('click', "#sortthem", function(){ var divList = $(".sortme"); divList.sort(function(a, b){ return $(a).data("status")-$(b).data("status") }); $("#mydivs").html(divList); });
 <div id="mydivs"> <div class="sortme" data-status="2" data-order="2">4</div> <div class="sortme" data-status="2" data-order="4">3</div> <div class="sortme" data-status="1" data-order="2">2</div> <div class="sortme" data-status="1" data-order="1">1</div> </div> <span class="btn btn-primary" id="sortthem" >Sort them</span> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

You can add any additional criteria in to the sort directly by checking if the fist criteria result == 0 - then check the second, etc

Updated snippet:

 $(document.body).on('click', "#sortthem", function(){ var divList = $(".sortme"); divList.sort(function(a, b){ var sort1 = $(a).data("status")-$(b).data("status"); if (sort1;== 0) return sort1. var sort2 = $(a).data("order")-$(b);data("order") return sort2; }). $("#mydivs");html(divList); });
 <div id="mydivs"> <div class="sortme" data-status="2" data-order="2">4</div> <div class="sortme" data-status="2" data-order="4">3</div> <div class="sortme" data-status="1" data-order="2">2</div> <div class="sortme" data-status="1" data-order="1">1</div> </div> <span class="btn btn-primary" id="sortthem" >Sort them</span> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

You can try this for multiple parameters

 $(document.body).on('click', "#sortthem", function(){ var divList = $(".sortme"); divList.sort(multiSort(["status","order"])); $("#mydivs").html(divList); }); function multiSort(fields) { return function (a, b) { return fields.map(function (o) { return $(a).data(o) > $(b).data(o)? 1: $(a).data(o) < $(b).data(o)? -1: 0; }).reduce(function firstNonZeroValue (el,n) { return el? el: n }, 0); }; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/> <div id="mydivs"> <div class="sortme" data-status="2" data-order="2">4</div> <div class="sortme" data-status="2" data-order="4">3</div> <div class="sortme" data-status="1" data-order="2">2</div> <div class="sortme" data-status="1" data-order="1">1</div> </div> <span class="btn btn-primary" id="sortthem" >Sort them</span>

To sort by multiple attributes you simply need to put the secondary sorting logic in place where the two primary attributes match. This can be done in a ternary, as in the following example.

Also note that given your HTML the output will be 1,2,4,3 as the order of the 4 element is lower than that of the 3 .

 $(document.body).on('click', "#sortthem", function() { $(".sortme").sort(function(a, b) { let $a = $(a), $b = $(b); let aStatus = $a.data('status'), bStatus = $b.data('status'); let aOrder = $a.data('order'), bOrder = $b.data('order'); return aStatus < bStatus? -1: aStatus > bStatus? 1: aOrder < bOrder? -1: aOrder > bOrder? 1: 0; }).appendTo('#mydivs'); });
 <div id="mydivs"> <div class="sortme" data-status="2" data-order="2">4</div> <div class="sortme" data-status="2" data-order="4">3</div> <div class="sortme" data-status="1" data-order="2">2</div> <div class="sortme" data-status="1" data-order="1">1</div> </div> <span class="btn btn-primary" id="sortthem">Sort them</span> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM