1
votes

La fonction mute un argument d'objet après l'exécution

J'ai une fonction qui prend un argument d'objet et devrait générer une valeur de chaîne à partir de cet argument. J'ai besoin d'utiliser cet argument dans une autre fonction mais lors de l'exécution de la première fonction, l'argument est changé.

C'est la fonction qui prend l'argument objet

    const { cron } = data;
    console.log(cron)
    const cronRules: string = generateCron(cron);
    console.log(cron)

Ceci est comment j'appelle la fonction

export const  generateCron(cronRules: any): string {
   const cronKeys: Array<string> = ['minute', 'hour', 'day', 'month', 'year'];
   cronKeys.forEach(key => {
     if (!cronRules[key]) {
       cronRules[key] = '*';
     }
   });
   const { minute, hour, day, month, year } = cronRules;
   const cron: string = `${minute} ${hour} ${day} ${month} ${year}`;
   return cron;
 }

supposons que j'ai l'objet cron comme {minute: 1, hour: 2} le La fonction renvoie 1 2 * * * comme prévu. mais consoler le cron objet (deuxième console) l'objet a déjà été changé en {minute: 1, heure: 2, jour: '*', mois: '*', année: '*'}

quelqu'un pourrait-il m'aider à comprendre ce qui se passe


1 commentaires

cron est cronRules dans la fonction generateCron et vous faites ceci cronRules [key] = '*' .


3 Réponses :


0
votes

Avec

 cronRules[key] = '*';

Vous faites muter votre objet passé à la fonction, car javascript est un langage de passage par référence pour objet


0 commentaires

1
votes

Les objets sont passés par référence en javascript, donc lorsque vous appelez

const { minute, hour, day, month, year } = cronRules;
const cron: string = `${minute || '*'} ${hour || '*'} ${day || '*'} ${month || '*'} ${year || '*'}`;
return cron;

vous modifiez l'objet "cron" que vous avez passé dans la fonction.

Au lieu de jouer avec l'objet cron, vous pouvez l'utiliser pour toute la fonction:

cronRules[key] = '*';

Ce qui accomplit la même tâche sans modifier l'objet "cron" d'origine.

p>


0 commentaires

0
votes

Tout simplement parce que vous itérez cronRules dans une boucle, vous devez prendre référence à cronRules et y apporter une modification.

const ref = JSON.parse(JSON.stringify(cronRules));

   const cronKeys: Array<string> = ['minute', 'hour', 'day', 'month', 'year'];
   cronKeys.forEach(key => {
     if (!ref[key]) {
       ref[key] = '*';
     }
   });

p>


0 commentaires