Recibí una gran variedad de objetos del backend y usé el filtrado para dejar solo estos valores
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US'] // so now this is what haveEntonces voy a hacer un mapa a través de los mercados, pero siempre comenzará por TI y seguirá ese orden. ¿Hay alguna manera de ordenar esto siguiendo un orden específico?
['US', 'DE', 'UK', 'FR', 'IT', 'NL']Quiero ordenar cada matriz que recibo siguiendo este orden específico incluso si no recibo todos los valores.
Se podría implementar una función que utilice un objeto como búsqueda para cada uno de los valores de precedencia de un mercado y que, además, coloque los elementos de mercado desconocidos en último lugar.
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; }Necesita escribir su propia función de comparación personalizada
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Algo como esto:
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 } })Puede asignar a cada mercado un valor dentro de un objeto y usarlo para compararlo y clasificarlo con la matriz de mercado que recibe del 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]))