11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'appelle des variables précalculées puis j'assigne à chacune un objet correspondant, chargé à partir d'un .json. Ça fonctionne, mais... j'ai fais un truc affreusement redondant :
// pour donner un peu de contexte :
const data = {}
const dataM = JSON.parse(fs.readFileSync('./data/json/movableFeasts.json'))
// les variables précalculées sont définies à ce niveau
data.m = {}

// le code redondant :
if (firstAdventSunday.hasSame(date, 'day')) data.m = dataM.firstAdventSunday
if (secondAdventSunday.hasSame(date, 'day')) data.m = dataM.secondAdventSunday
if (thirdAdventSunday.hasSame(date, 'day')) data.m = dataM.thirdAdventSunday
if (fourthAdventSunday.hasSame(date, 'day')) data.m = dataM.fourthAdventSunday
if (immaculateConception.hasSame(date, 'day')) data.m = dataM.immaculateConception
if (holyFamily.hasSame(date, 'day')) data.m = dataM.holyFamily
if (epiphany.hasSame(date, 'day')) data.m = dataM.epiphany
if (baptismOfTheLord.hasSame(date, 'day')) data.m = dataM.baptismOfTheLord
if (josephHusbandOfMary.hasSame(date, 'day')) data.m = dataM.josephHusbandOfMary
if (annunciation.hasSame(date, 'day')) data.m = dataM.annunciation
if (ashWednesday.hasSame(date, 'day')) data.m = dataM.ashWednesday
if (firstLentSunday.hasSame(date, 'day')) data.m = dataM.firstLentSunday
if (secondLentSunday.hasSame(date, 'day')) data.m = dataM.secondLentSunday
if (thirdLentSunday.hasSame(date, 'day')) data.m = dataM.thirdLentSunday
if (fourthLentSunday.hasSame(date, 'day')) data.m = dataM.fourthLentSunday
if (fiveLentSunday.hasSame(date, 'day')) data.m = dataM.fiveLentSunday
if (palmSunday.hasSame(date, 'day')) data.m = dataM.palmSunday
// et il y en a encore beaucoup comme ça...

Dites-moi qu'il y a une solution toute simple ! J'ai tellement la tête dans le guidon que j'ai du mal à prendre du recul sur mon code.
Modifié par Olivier C (06 Jan 2021 - 21:37)
Modérateur
Et l'eau,

Je ne vois pas totalement le contexte.
C'est quoi : palmSunday, fiveLentSunday, fourthLentSunday, etc. ?
Des instances sous quelle forme ? Du moins comment obtiens-tu firstAdventSunday.hasSame(....) ?
Modifié par niuxe (06 Jan 2021 - 22:21)
Hello,

Quelque chose de ce style ?


// cet array peut certainement être raccourci, mais je ne sais pas comment tes variables sont générés, là c'est un premier jet
const eventData = [
  ['firstAdventSunday',firstAdventSunday],
  ['secondAdventSunday',secondAdventSunday],
  ['thirdAdventSunday',thirdAdventSunday],
  ['fourthAdventSunday',fourthAdventSunday]
  // etc
];

for ( let i = 0; i < eventData.length; i++ ) {
  
  if ( eventData[i][1].hasSame(date, 'day')) data.m = dataM[eventData[i][0]];

}


Sinon tu peux pusher tes variables à la création dans un tableau et c'est plus simple encore:

// imaginons que tu ais un tableau comme ceci
const eventVars = [
  [firstAdventSunday],
  [secondAdventSunday],
  [thirdAdventSunday],
  [fourthAdventSunday]
  // etc
];

// pour transformer le nom d'une variable en string
const varToString = varObj => Object.keys(varObj)[0];

for ( let i = 0; i < eventVars.length; i++ ) {
  
  if ( eventVars[i].hasSame(date, 'day')) data.m = dataM[varToString({eventVars[i]})];

}

Modérateur
Et l'eau Stryk,

J'ai pensé à la même chose que toi. Il est sur NodeJS. Donc il peut faire quelque chose de beaucoup plus dynamique. Mais le contexte est manquant, d'où mes questions. Après je peux me tromper.
Ok, je vous donne un peu plus de contexte. Pour la manipulation des dates j'utilise luxon.js, la fonction .hasSame() vient de là. Exemple de définition pour deux variables, "josephHusbandOfMary" et "divineMercySunday" :
// ces variables renvoient un objet date :
const march19 = DateTime.fromFormat('1903' + year, 'ddMMyyyy'),
        march19InHolyWeek = holyWeek.contains(march19) ? true : false,
        march19InLentSunday = (lent.contains(date) && march19.weekday === 7) ? true : false,
        josephHusbandOfMary = march19InHolyWeek ? palmSunday.plus({days: -1}) : (march19InLentSunday ? march19.plus({days: 1}) : march19)
// une variable plus simple à définir :
const divineMercySunday = easter.plus({days: 7})

// plus loin, dans la partie que j'aimerais factoriser, je compare les variables avec .hasSame(date, 'day') qui renvoie true ou false. Si true alors appel aux données stockées dans un JSON et converties en objet :
if (josephHusbandOfMary.hasSame(date, 'day')) data.m = dataM.josephHusbandOfMary
if (divineMercySunday.hasSame(date, 'day')) data.m = dataM.divineMercySunday


Exemple d'output pour Saint Joseph :
{
  m: {
    key: 'josephHusbandOfMary',
    name: 'Saint Joseph, chaste Époux de la Bienheureuse Vierge Marie',
    color: [ 'white' ],
    type: 1,
    priority: 3
  }
}

S'il le faut je mettrais tout le code mais j'avais peur que ça devienne illisible (environ 235 lignes, et on n'a pas les outputs).
Modifié par Olivier C (07 Jan 2021 - 13:08)
Hello Niuxe,

Oui tout à fait, après je donnais une méthode générique Smiley lol

@Olivier en fait il te suffit de faire un push comme évoqué pour te servir du deuxième code:

let eventVars = [];
// puis à chaque déclaration
eventVars.push(divineMercySunday);
Merci. Je vais essayer de regarder tout ça cet après-midi et ferais un retour.

Edit : bon ben finalement ça ne sera pas pour aujourd'hui. Pour le principe je ferais un retour - comme à mon habitude - dès que possible.
Modifié par Olivier C (08 Jan 2021 - 21:27)