Group by matching data id and order by another data attribute

Viewed 70

Is it possible to group a number of divs by matching data-id and order it by another data attribute. Can this be done with underscorejs or plain javascript?

Current layout of div and Desired output

    <div id="parentID">
      <div data-id="71" data-orderby="2" class="child">ID: 71 Order 2</div>
      <div data-id="71" data-orderby="3" class="child">ID: 71 Order 3</div>
      <div data-id="71" data-orderby="1" class="child">ID: 71 Order 1</div>
      <div data-id="62" data-orderby="2" class="child">ID: 62 Order 2</div>
      <div data-id="62" data-orderby="1" class="child">ID: 62 Order 1</div>
      <div data-id="59" data-orderby="1" class="child">ID: 59 Order 1</div>
      <div data-id="59" data-orderby="3" class="child">ID: 59 Order 3</div>
      <div data-id="59" data-orderby="2" class="child">ID: 59 Order 2</div>
    </div>

    <div id="parentID">
      <div data-id="71" data-orderby="1" class="child">ID: 71 Order 1</div>
      <div data-id="71" data-orderby="2" class="child">ID: 71 Order 2</div>
      <div data-id="71" data-orderby="3" class="child">ID: 71 Order 3</div>
      <div data-id="62" data-orderby="1" class="child">ID: 62 Order 1</div>
      <div data-id="62" data-orderby="2" class="child">ID: 62 Order 2</div>
      <div data-id="59" data-orderby="1" class="child">ID: 59 Order 1</div>
      <div data-id="59" data-orderby="2" class="child">ID: 59 Order 2</div>
      <div data-id="59" data-orderby="3" class="child">ID: 59 Order 3</div>
    </div>

2 Answers

You can sort your div on id and orderby attribute.

$(function() {
  $("#parentID div").sort((a,b) => {
      return $(b).data('id') - $(a).data('id') || $(a).data('orderby') - $(b).data('orderby');
  }).appendTo('#parentID');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parentID">
  <div data-id="71" data-orderby="2" class="child">ID: 71 Order 2</div>
  <div data-id="71" data-orderby="3" class="child">ID: 71 Order 3</div>
  <div data-id="71" data-orderby="1" class="child">ID: 71 Order 1</div>
  <div data-id="62" data-orderby="2" class="child">ID: 62 Order 2</div>
  <div data-id="62" data-orderby="1" class="child">ID: 62 Order 1</div>
  <div data-id="59" data-orderby="1" class="child">ID: 59 Order 1</div>
  <div data-id="59" data-orderby="3" class="child">ID: 59 Order 3</div>
  <div data-id="59" data-orderby="2" class="child">ID: 59 Order 2</div>
</div>

Use this script

$("#parentID div.child").sort(function(a, b) {
  return $(a).data("id") - $(b).data("id");
}).appendTo("#parentID");
Related