0

I received a big array of object from the backend and I used filtering to leave only these values

const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US'] // so now this is what have

I am going then to map through markets, but it will always start by IT and follows that order. Is there a way to sort this following a specific order?

['US', 'DE', 'UK', 'FR', 'IT', 'NL']

I want to sort every array that i receive following this specific order even if I don't receive all the values.

David
  • 208,112
  • 36
  • 198
  • 279
Laugh Tale
  • 13
  • 5
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort ? (With your custom sorting logic, of course.) – David May 13 '22 at 13:59
  • Does this answer your question? [JavaScript : Sorting an array](https://stackoverflow.com/questions/45162860/javascript-sorting-an-array) – Kai-Sheng Yang May 13 '22 at 14:01
  • Sounds to me like you want to [sort an array based on another array](https://stackoverflow.com/questions/13304543/javascript-sort-array-based-on-another-array). – Alexander Nied May 13 '22 at 17:43

4 Answers4

1

One could implement a function which uses an object as lookup for each of a market's precedence value and which in addition places unknown market items last.

function getAssuredMarketPrecedence(marketList) {
  const marketPrecedence = {
    US: 0, DE: 1, UK: 2, FR: 3, IT: 4, NL: 5,
  };
  return Array
    .from(marketList)
    .sort((a, b) =>
      (marketPrecedence[a] ?? 1000)  - (marketPrecedence[b] ?? 1000)
    );
}
const markets = ['IT', 'DE', 'unknown2', 'UK', 'FR', 'unknown1', 'NL', 'US']
const sorted = getAssuredMarketPrecedence(markets);

console.log({ markets, sorted });
.as-console-wrapper { min-height: 100%!important; top: 0; }
Peter Seliger
  • 11,747
  • 3
  • 28
  • 37
0

You need to write your own custom compare function

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Smth like this:

markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']

markets.sort((item1, item2) => {
    neededOrder = ['US', 'DE', 'UK', 'FR', 'IT', 'NL']
    idx1 = neededOrder.indexOf(item1)
    idx2 = neededOrder.indexOf(item2)
    if(idx1 < idx2) {
        return -1
    }
    else if(idx1 > idx2) {
        return 1
    } else {
        return 0
    }
})
random322
  • 26
  • 2
0

You can assign each market a value within an object, and use that to compare and sort against the market array you receive from the backend:

const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']

let mappedMarkets = {
  'US': 1,
  'DE': 2,
  'UK': 3,
  'FR': 4,
  'IT': 5,
  'NL': 6
}

console.log(markets.sort((a, b) => mappedMarkets[a] - mappedMarkets[b]))
Marco
  • 511
  • 6
  • 16
  • 1
    @RamiBenAbdallah ... not knowing the exact requirements, the above approach would fail to sort markets with unknown market items like e.g. `const markets = ['IT', 'DE', 'unknwon2', 'UK', 'FR', 'unknwon1', 'NL', 'US']`. This is not an issue as long as there are always just market items in an array which have a mapped counterpart. – Peter Seliger May 13 '22 at 14:59
0

You can:

  • Break the list into two sub-arrays
  • Those on the order list which you can sort in the desired order
  • Those not on the list which you do not have to sort
  • Combine the sub-arrays using: [...s1, ...s2]

const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US','KE','UG','TZ'], // so now this is what have
      order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
      
      output = [
          ...markets.filter(c => order.includes(c)).sort(
              (a, b) =>
              order.findIndex(x => x === a) - order.findIndex(x => x === b)
          ),
          ...markets.filter(c => !order.includes(c))
      ];
      
      
console.log( output );

Alternatively, ...

If each markets only includes items that are in order you can just leave out the second sub-array and use the following instead:

const markets = ['IT', 'DE', 'UK', 'NL', 'US'], 
      order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
      
      output = markets.filter(c => order.includes(c)).sort(
          (a, b) =>
          order.findIndex(x => x === a) - order.findIndex(x => x === b)
      );
      
      
console.log( output );
PeterKA
  • 24,158
  • 5
  • 26
  • 48