Search code examples
javascripthtmlangularjsangular-filters

How should I sort a list of prices considering different currencies (EUR and GBP)?


I have a list with races, and the purses are in Euros and in GBP, and I need to order by purse considering the currency. Example: GBP19.000 comes firsts, and EUR19.000 comes second, because GB is more valuable than EUR.

That's my Json

vm.races = [
    {id:1, country: 'United Kingdom', flag: 'flag-gb', cities:[{name:'Fontwell', race_type:'J', start_time: '09:55', purse:'26.000', currency: 'GBP'}, {name:'Hereford', race_type:'J', start_time: '5m', purse:'35.000', currency: 'EUR'}, {name:'Wolverhampton',race_type:'G', start_time: '10:50', purse:'32.000', currency: 'EUR'}]},
    {id:2, country: 'South Africa', flag: 'flag-za', cities:[{name:'Flamingo Park', race_type:'G', start_time: '10:35', purse:'10.000', currency: 'EUR'}]},
    {id:3, country: 'France', flag: 'flag-fr', cities:[{name:'Melton PMU', race_type:'T', start_time: '11:15', purse:'25.000', currency: 'EUR'}, {name:'Pau', race_type:'J', start_time: '08:50', purse:'33.000', currency: 'EUR'}, {name:'Vincennes', race_type:'T', start_time: 'Due', purse:'29.000', currency: 'EUR'}, {name:'Marseilles', race_type:'G', start_time: '09:20', purse:'38.000', currency: 'EUR'}, {name:'Toulouse', race_type:'T', start_time: '09:00', purse:'35.000', currency: 'EUR'}]},
    {id:4, country: 'Sweden', flag: 'flag-se', cities:[{name:'Gävle', race_type:'T', start_time: '10:45', purse:'22.000', currency: 'EUR'}, {name:'Axevalla', race_type:'T', start_time: 'Due', purse:'37.000', currency: 'EUR'}]},
    {id:5, country: 'Norway', flag: 'flag-no', cities:[,{name:'Leangen', race_type:'T', start_time: '09:05', purse:'12.000', currency: 'EUR'}, {name:'Leangen', race_type:'T', start_time: '09:05', purse:'12.000', currency: 'GBP'}]},
    {id:6, country: 'Australia', flag: 'flag-au', cities:[{name:'Melton', race_type:'T', start_time: '10:15', purse:'42.600', currency: 'EUR'}]},
    {id:7, country: 'Brazil', flag: 'flag-br', cities:[{name:'Blumenau', race_type:'D', start_time: '11:40', purse:'15.000', currency: 'EUR'}]}
    ]

That's my HTML:

<li class="list-group-item" ng-repeat="city in race.cities | orderBy: '-realPurse' | filter: vm.filter">

That's my JS

function realPurse(item) {
  let realPurse;
  if (item.currency === 'EUR') {
    realPurse = (item.purse / 1.13);
    item.realPurse = realPurse;
  } else{
    realPurse = item.purse;
    item.realPurse = realPurse;
  }
  return  item.realPurse;
}

Solution

  • This sorts the cities by converted purse, then sorts the races by the top city.

    races.map((race) => {
      race.cities = race.cities.sort((a, b) => {
        a = a.currency === 'EUR' ? a.purse : a.purse * 1.13
        b = b.currency === 'EUR' ? b.purse : b.purse * 1.13
    
        return b - a
      })
    
      return race
    })
    .sort((a, b) => {
      a = a.cities[0].currency === 'EUR' ? a.cities[0].purse : a.cities[0].purse * 1.13
      b = b.cities[0].currency === 'EUR' ? b.cities[0].purse : b.cities[0].purse * 1.13
    
      return b - a
    })
    

    The result I get is this:

    {id: 6, country: "Australia", flag: "flag-au", cities: Array}
    {id: 3, country: "France", flag: "flag-fr", cities: Array}
    {id: 4, country: "Sweden", flag: "flag-se", cities: Array}
    {id: 1, country: "United Kingdom", flag: "flag-gb", cities: Array}
    {id: 7, country: "Brazil", flag: "flag-br", cities: Array}
    {id: 5, country: "Norway", flag: "flag-no", cities: Array}
    {id: 2, country: "South Africa", flag: "flag-za", cities: Array}
    

    Some cities sorted:

    // Race 3, France
    {name: "Marseilles", race_type: "G", start_time: "09:20", purse: "38.000", currency: "EUR"}
    {name: "Toulouse", race_type: "T", start_time: "09:00", purse: "35.000", currency: "EUR"}
    {name: "Pau", race_type: "J", start_time: "08:50", purse: "33.000", currency: "EUR"}
    {name: "Vincennes", race_type: "T", start_time: "Due", purse: "29.000", currency: "EUR"}
    {name: "Melton PMU", race_type: "T", start_time: "11:15", purse: "25.000", currency: "EUR"}
    
    // Race 5, Norway
    {name: "Leangen", race_type: "T", start_time: "09:05", purse: "12.000", currency: "GBP"}
    {name: "Leangen", race_type: "T", start_time: "09:05", purse: "12.000", currency: "EUR"}