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


Julien THOMAS
Réponse acceptée

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
Auteur
Réponse acceptée

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.

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

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?

ca ma servis