web-dev-qa-db-fra.com

JSON imbriqué: Comment ajouter (Push) de nouveaux éléments à un objet?

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();
32
Josiah

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.

45
Karl Knechtel

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",""]};
12

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};
8
jerjer

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>

0
Yi-Ting Liu