J'ai une chaîne "APRIL,AUGUST,JULY,JUNE,MAY". Je veux le commander par nom de mois. La sortie requise est APRIL,MAY,JUNE,JULY,AUGUST.

-1
Rrptm 14 mars 2021 à 21:04

4 réponses

Meilleure réponse

Vous pouvez conserver la liste des commandes de tous les mois et effectuer le tri en fonction de cela:

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 mars 2021 à 18:39

La solution la plus simple est probablement:

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 mars 2021 à 18:12

Utilisez Array # filter () sur un tableau pré-ordonné et vérifiez si chaque nom existe dans la chaîne

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 mars 2021 à 18:28

Les autres solutions peuvent être inefficaces car elles reposent sur les prototypes String.includes ou Array.indexOf, qui coûtent à eux seuls O (n) (où n est la longueur de la chaîne d'entrée). Je propose une solution alternative qui utilise un dictionnaire, qui prend en charge l'indexation en temps O(1) amorti. La complexité temporelle globale est O(m logm), où m est le nombre de mois dans la chaîne input.

Vous pouvez indexer les noms de mois dans monthNamesObj en temps O (1) amorti.

    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 mars 2021 à 18:43