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
3 Réponses :
Avec
cronRules[key] = '*';
Vous faites muter votre objet passé à la fonction, car javascript est un langage de passage par référence pour objet
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>
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>
cron
estcronRules
dans la fonctiongenerateCron
et vous faites cecicronRules [key] = '*'
.