webentwicklung-frage-antwort-db.com.de

Verschachtelte JSON: Wie füge ich neue Objekte zu einem Objekt hinzu?

Ich fange gerade erst mit Arrays, Objects und JSON an - hoffentlich übersieht ich hier etwas einfaches. Beim Versuch, add (Push) ein neues Element in mein Json-Objekt aufzunehmen, tritt ein Fehler auf.

Ich erhalte den folgenden Fehler: Result of expression 'library.Push' [undefined] is not a function(am Ende meines Code-Snippets).

// 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 ist ein Objekt, kein Array. Sie schieben Dinge auf Arrays. Im Gegensatz zu PHP unterscheidet Javascript.

Ihr Code versucht, eine Zeichenfolge zu erstellen, die wie der Quellcode für ein Schlüsselwertpaar aussieht, und "schiebt" es dann auf das Objekt. Das ist noch nicht einmal annähernd so, wie es funktioniert.

Sie möchten dem Objekt ein neues Schlüsselwertpaar hinzufügen, wobei der Schlüssel der Titel und der Wert ein anderes Objekt ist. Das sieht so aus:

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

"JSON-Objekt" ist ein vager Begriff. Sie müssen darauf achten, zwischen einem tatsächlichen Objekt in Ihrem Programm und einem Textfragment im JSON-Format zu unterscheiden.

45
Karl Knechtel

Wenn Ihr JSON ohne Schlüssel ist, können Sie dies folgendermaßen tun:

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

Also probieren Sie das aus:

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"]
    }]
}

Dann:

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

Push ist eine Array-Methode. Für Json-Objekte müssen Sie sie möglicherweise definieren

das sollte es tun:

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

Dies erreichen Sie mit der Funktion Lodash_.assign .

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