Tengo una cadena "APRIL,AUGUST,JULY,JUNE,MAY". Quiero ordenarlo por mes. La salida requerida es APRIL,MAY,JUNE,JULY,AUGUST.

-1
Rrptm 14 mar. 2021 a las 21:04

4 respuestas

La mejor respuesta

Puede mantener la lista de pedidos de todos los meses y hacer la clasificación en función de eso:

const order = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"];

const sort = (data) =>
  data
.split(',')
.sort((a, b) => order.indexOf(a) - order.indexOf(b))
.join()

const data1 = 'APRIL,AUGUST,JULY,JUNE,MAY'
console.log(sort(data1))

const data2 = 'APRIL,AUGUST,JULY,JUNE,MAY,APRIL'
console.log(sort(data2))
2
Ajeet Shah 14 mar. 2021 a las 18:39

La solución más sencilla probablemente sea:

const s = "APRIL,AUGUST,JULY,JUNE,MAY";
const months = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "OCTOBER", "SEPTEMBER", "NOVEMBER", "DECEMBER"]
let resultArray = [];

months.forEach(month => {
    if (s.includes(month)) {
        resultArray.push(month);
    }
})

console.log(resultArray.join(','));
1
Daniel Gabzdyl 14 mar. 2021 a las 18:12

Use Array # filter () en una matriz preordenada y verifique si cada nombre existe en la cadena

const s = "APRIL,AUGUST,JULY,JUNE,MAY";
const months = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "OCTOBER", "SEPTEMBER", "NOVEMBER", "DECEMBER"]

const res = months.filter(m => s.includes(m)).join()

console.log(res)
1
charlietfl 14 mar. 2021 a las 18:28

Las otras soluciones pueden ser ineficaces porque se basan en los prototipos String.includes o Array.indexOf, que cuestan solo O (n) (donde n es la longitud de la cadena de entrada). Propongo una solución alternativa que usa un diccionario, que admite la indexación en tiempo O(1) amortizado. La complejidad de tiempo total es O(m logm), donde m es el número de meses en la cadena input.

Puede indexar los nombres de los meses en monthNamesObj en tiempo amortizado O (1).

    const input = "APRIL,AUGUST,JULY,JUNE,MAY";

    // inputMonthNames = ['APRIL', 'AUGUST', 'JULY', 'JUNE', 'MAY']
    const inputMonthNames = input.split(',');

    // dictionary that maps month names to the correspective order index
    const monthNamesObj = {
      'JANUARY': 0,
      'FEBRUARY': 1,
      'MARCH': 2,
      'APRIL': 3,
      'MAY': 4,
      'JUNE': 5,
      'JULY': 6,
      'AUGUST': 7,
      'SEPTEMBER': 8,
      'OCTOBER': 9,
      'NOVEMBER': 10,
      'DECEMBER': 11,
    };

    // sort the input month names according to their numeric order
    const orderedMonths = inputMonthNames.sort((a, b) monthNamesObj[a] - monthNamesObj[b]);

    // APRIL,MAY,JUNE,JULY,AUGUST
    console.log(orderedMonths.join(','));
1
Alberto Schiabel 14 mar. 2021 a las 18:43