How to sort ISO 8601 duration

Viewed 122

How to sort ISO 8601 duration Example: "P1DT02H26M" between two same times in javascript,

I just tried in this way.

var asc = true
document.getElementById('durationSort').addEventListener('click',function(){
  if(asc){
    modifiedData.data.offers.sort(function(a, b) {
      var c = a.slices[0].duration, d = b.slices[0].duration; 
      return c-d; 
    })
    asc = false
    offers(modifiedData)
    document.getElementById('durationarrow').innerHTML = '<i class="fas fa-hand-point-down" style="color:#01b1ef;"></i>'
    document.getElementById('arrivalarrow').innerHTML = null
    document.getElementById('depaturearrow').innerHTML = null
    document.getElementById('pricearrow').innerHTML = null
  }else{
    var list1 = modifiedData.data.offers
    list1.sort(function(a, b){
      var c = a.slices[0].duration, d = b.slices[0].duration; 
      return c-d; 
    })
    
    modifiedData.data.offers = list1.reverse()
    asc = true
    offers(modifiedData)
    document.getElementById('durationarrow').innerHTML = '<i class="fas fa-hand-point-up" style="color:#01b1ef;"></i>'
    document.getElementById('arrivalarrow').innerHTML = null
    document.getElementById('depaturearrow').innerHTML = null
    document.getElementById('pricearrow').innerHTML = null
  }
});
1 Answers

Moment.js includes the ability to parse ISO8601 durations.

Once we have this, it's easy to sort a list of durations, we can simply subtract one from the other to get the difference in milliseconds.

let durations = [{minute: 5, day: 1}, { hour: 10 }, { day: 1, hour: 2, minute: 26 }, { second: 3 }, { day: 20 }].map(d => moment.duration(d).toISOString());

function sortDurations(durations) {
    return [...durations].sort( (a, b) => {
        return moment.duration(a) - moment.duration(b);
    })
}

console.log("Unsorted durations:", durations);
console.log("Sorted durations:", sortDurations(durations));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js" integrity="sha512-rmZcZsyhe0/MAjquhTgiUcb4d9knaFc7b5xAfju483gbEXTkeJRUMIPk6s3ySZMYUHEcjKbjLjyddGWMrNEvZg==" crossorigin="anonymous"></script>

Related