Nested JSON: Comment ajouter (pousser) de nouveaux éléments à un objet?

Je commence à commencer par Arrays, Objects et JSON – alors j'espère qu'il y a juste quelque chose de simple que je vois ici. Je rencontre une erreur en essayant d' ajouter (pousser) un nouvel élément dans mon objet json.

Je rencontre l'erreur suivante: Result of expression 'library.push' [undefined] is not a function (vers le bas de mon extrait de code) .

Aidez-moi, s'il vous plaît! Merci!

 // This is my JSON object generated from a database var library = { "Gold Rush" : { "foregrounds" : ["Slide 1","Slide 2","Slide 3"], "backgrounds" : ["1.jpg","","2.jpg"] } "California" : { "foregrounds" : ["Slide 1","Slide 2","Slide 3"], "backgrounds" : ["3.jpg","4.jpg","5.jpg"] } } // These will be dynamically generated vars from editor var title = "Gold Rush"; var foregrounds = ["Howdy","Slide 2"]; var backgrounds = ["1.jpg",""]; function save () { // If title already exists, modify item if (library[title]) { // Replace values with new library[title].foregrounds = foregrounds; library[title].backgrounds = backgrounds; // Save to Database. Then on callback... document.write('Changes Saved to <b>'+title+'</b>'); // If title does not exist, add new item else { // Format it for the JSON object var item = ('"'+title+'" : {"foregrounds" : '+foregrounds+',"backgrounds" : '+backgrounds+'}'); // THE PROBLEM SEEMS TO BE HERE?? // Error: "Result of expression 'library.push' [undefined] is not a function" library.push(item); // Save to Database. Then on callback... document.write('Added: <b>'+title+'</b>'); } } save(); 

library est un objet, pas un tableau. Vous poussez les choses sur des tableaux. Contrairement à PHP, Javascript fait une distinction.

Votre code tente de créer une chaîne qui ressemble au code source d'une paire clé-valeur, puis la "repousse" sur l'objet. Cela n'est même pas proche de la façon dont cela fonctionne.

Ce que vous voulez faire, c'est ajouter une nouvelle paire clé-valeur à l'objet, où la clé est le titre et la valeur est un autre objet. Cela ressemble à ceci:

 library[title] = {"foregrounds" : foregrounds, "backgrounds" : backgrounds}; 

L'objet "JSON" est un terme vague. Vous devez faire attention à distinguer entre un objet réel en mémoire dans votre programme et un fragment de texte en format JSON.

Si votre JSON est sans clé, vous pouvez le faire comme ceci:

 library[library.length] = {"foregrounds" : foregrounds,"backgrounds" : backgrounds}; 

Alors, essayez ceci:

 var library = {[{ "title" : "Gold Rush", "foregrounds" : ["Slide 1","Slide 2","Slide 3"], "backgrounds" : ["1.jpg","","2.jpg"] }, { "title" : California", "foregrounds" : ["Slide 1","Slide 2","Slide 3"], "backgrounds" : ["3.jpg","4.jpg","5.jpg"] }] } 

Alors:

 library[library.length] = {"title" : "Gold Rush", "foregrounds" : ["Howdy","Slide 2"], "backgrounds" : ["1.jpg",""]}; 

Push est une méthode Array, pour l'objet json, vous devrez peut-être le définir

Cela devrait le faire:

 library[title] = {"foregrounds" : foregrounds,"backgrounds" : backgrounds};