Je commence tout juste avec Arrays, Objects et JSON - j'espère donc qu'il y a quelque chose de simple que j'oublie ici. Je rencontre une erreur en essayant de ajouter (Push) 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).
// 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 la différence.
Votre code tente de créer une chaîne qui ressemble au code source d'une paire clé-valeur, puis de le "transmettre" à l'objet. Ce n'est même pas proche de la façon dont cela fonctionne.
Ce que vous voulez faire est d'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};
"Objet JSON" est un terme vague. Vous devez faire attention à faire la distinction entre un objet réel en mémoire dans votre programme et un fragment de texte au 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"]
}]
}
Ensuite:
library[library.length] = {"title" : "Gold Rush", "foregrounds" : ["Howdy","Slide 2"], "backgrounds" : ["1.jpg",""]};
Push est une méthode Array, vous devrez peut-être définir l'objet json
cela devrait le faire:
library[title] = {"foregrounds" : foregrounds,"backgrounds" : backgrounds};
Vous pouvez y parvenir en utilisant Lodash_.assign
function.
library[title] = _.assign({}, {'foregrounds': foregrounds }, {'backgrounds': backgrounds });
// 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]) {
// override one Object with the values of another (lodash)
library[title] = _.assign({}, {
'foregrounds': foregrounds
}, {
'backgrounds': backgrounds
});
console.log(library[title]);
// Save to Database. Then on callback...
// console.log('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...
console.log('Added: <b>' + title + '</b>');
}
}
save();
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>