0
votes

La valeur de réglage de la touche dans l'objet imbriqué ne se produit pas de manière incorrecte à l'aide d'A pour boucle et si la déclaration

Voici un exemple que vous pouvez taper dans votre console. Super nouveau à JavaScript. L'exemple est reproductible en ouvrant un nouvel onglet et en tapant sur une console (la fonction de console de JSX Fiddle est en version bêta, donc je ne sais pas si elle peut être approuvée) xxx

quoi J'ai l'intention de faire, c'est que pour l'index 0ème seul, définissez les minuteries [0] ["starttime"] comme date.now () , et pour le reste> et pour le reste , laissez le starttime être null tel que défini dans le TimerObj .

étrangement, après avoir exécuté la boucle, je vois Pour tout i , le date.now () a été défini. Je comprends que les objets JavaScript sont mutables, mais pourquoi sont pourquoi tous les indices sont définis sur DATE.NOW () ?

J'ai regardé l'objet Questions relatives à un concept appel "gel", pas sûr d'avoir mes bases de droite.

Edit: Je pense que cela est associé à la référence d'objet modifiée ..


0 commentaires

3 Réponses :


1
votes

JavaScript ne copie pas d'objets. Il passe des références autour, de sorte que lorsque vous assignez minuterie [i] = TimerObj une fois, alors vous attribuez date.now () une fois, cette valeur va à votre unique TimeOrobj . Toutes les affectations ultérieures de TimerObj à TIMERS [I] pour tous i se réfectez au Single TimerObj Vous avez défini. < / p>

Pour corriger cette force une copie: minuterie [i] = json.parse (json.stringify (TimerObj));

Cela permettra de sérialiser votre TimerObj à une chaîne JSON, puis convertissez-le à un nouvel objet JavaScript, puis affectez le nouvel objet à TIMERS [I] .

De cette façon, vous vous retrouvez avec des copies de TimerObj dans chaque emplacement de votre TIMERS Array.


0 commentaires

1
votes

var clothing = ['card0', 'card1', 'card2', 'card3'];
var timers = {}
var timerObj = {"startTime": null, "pauseTime": null, "elapsedTime": null, "hasSubmitted": false} //Nested object I want for all indices, will manipulate 0th index alone inside for loop

for (var i = 0; i < clothing.length; i++) {
  timers[i] = Object.assign({}, timerObj)
  if (i == 0) {
    timers[i]["startTime"] = Date.now();
  } 
} 
console.log(timers)


0 commentaires

1
votes

Vous devez cloner votre objet code>. Il y a plusieurs façons de cloner. On serait opérateur répandu (...) code>. Comme ci-dessous:

p>

let clothing = ['card0', 'card1', 'card2', 'card3'];
let timers = {}
let timerObj = {"startTime": null, "pauseTime": null, "elapsedTime": null, "hasSubmitted": false}

clothing.forEach((val, i)=>{
    timers[i] = {...timerObj};
    if(i==0){
       timers[i].startTime = Date.now()
    }
});
console.log(timers);


0 commentaires