écriture au mauvais endroit

Par Florian Lefebvre, il y a 4 ans


Javascript NodeJS

Bonjour à tous,

j'essaie de créer un systéme de sauvegarde json maison sur un bot discord, mais celui-ci ne sauvegarde pas les données dans le bon bloc

//recherche des serveurs où se trouve le bot let pass=0; for (let guild_info of guilds.values()) { //si ce serveur n'est pas dans la sauvegarde if (!(guild_info['id'].slice(-4) in data_serveurs)) { pass++ console.log("id: "+guild_info['id']) console.log("id_short: "+ guild_info['id'].slice(-4) ) console.log("name: "+guild_info['name']) let to_sav=trame; to_sav["id"] = guild_info['id']; to_sav["name"] = guild_info['name']; console.log("id_ver: "+guild_info['id']) console.log("id_ver_short: "+ guild_info['id'].slice(-4) ) console.log("name_ver: "+guild_info['name']) data_serveurs[guild_info['id'].slice(-4)]=to_sav; edit = true; //console.log(JSON.stringify(data_serveurs[guild_info['id']], null, 4)) } console.log("pass: "+pass) console.log(JSON.stringify(data_serveurs, null, 4)) }

dans le déroulé si dessous, on voie bien, qu'il rajoute bien les donnée manquante mais qu'il écrase les donnée d'un autre bloc.
Le bloc se trouvant aprés pass, montre la sauvegarde complete aprés écriture

{} id: 822907049326542888 id_short: 2888 name: En terrain neutre id_ver: 822907049326542888 id_ver_short: 2888 name_ver: En terrain neutre pass: 1 { "2888": { "name": "En terrain neutre", "id": "822907049326542888", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" } } id: 851105621977858049 id_short: 8049 name: Home LIIA id_ver: 851105621977858049 id_ver_short: 8049 name_ver: Home LIIA pass: 2 { "2888": { "name": "Home LIIA", "id": "851105621977858049", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" }, "8049": { "name": "Home LIIA", "id": "851105621977858049", "volume": "5", "welcome": "", "tab_1d100": {}, "length_1d100": "0" } } Mise à jours réussi

normalement le bloc 2288 devairt avoir comme id 822907049326542888 et name En terrain neutre

A lécriture du premier bloc c'est bon

mais lors de l'écriture du seconde bloc, le premier bloc est corrompu

j'ai essaie des clés courte, mais sans effets, je ne comprend pas pourquoi il écrit pas au bonne endroit.

Merci de votre aide

5 réponses

Florian Lefebvre, il y a 4 ans

j'ai pas mal cherché mais sans résultat, j'ai découvert que tous le tableau est réécrit avec les données du dernier bloc, comme si il y avait un soucis de pointer.
j'ai essayer avec map mais toujours pareil

Florian Lefebvre, il y a 4 ans

j'ai trouvé, mais j'aimerai bien comprendre
let to_sav=trame;

A la base trame se trouve dans le fichier main

global.trame = {"name": "", "id": "", "volume": "5", "welcome": "", "tab_1d100":{},"length_1d100":'0'};//trame avec les paramêtre de chaque serveur

tous comme son nom l'indique il s'agit d'une trame à remplir
si je l'utilise tout les let save vont avoir le même contenu

par contre
si je ne l'utilise pas et que je fait

let to_save=new Array(); to_save.id=value['id'] to_save.name=value['name'] to_save.volume=5 to_save.welcome=""

les infos sont bonnes.

comment puis je utiliser un équivalent de mon idée de tableau pré-construit?

Julien THOMAS, il y a 4 ans

Regardes les notions d'imutabilité en JavaScript :
Si tu veux copier le contenu d'une variable, et non sa référence, l faut que tu utilise les spread operators

et don ton object to_save peut être construit à partir de ta trame ainsi :

const to_save = { ...trame, id: guild_info['id'], name: guild_info['name'] }

ainsi, to_save est immutable, et trame est déconstruit pour en récupérer les valeures, plutôt qu'une référence.

Plus généralement, tu peux cloner un objet ainsi : objClone = { ...obj }; (cf MDN)

Florian Lefebvre, il y a 4 ans

merci pour la réponse qui répond à mon autre question sur l'autre post.
bas vue que netflix à augmenter j'ai trouver de quoi lire ce soir.

manibossofficiel, il y a 4 ans

ca ma servis