2011-06-28 30 views
32

Estoy empezando con Arrays, Objects y JSON, así que espero que haya algo simple que estoy pasando por alto aquí. Me aparece un error al intentar agregar (pulsar) un nuevo elemento en mi objeto json.JSON anidado: cómo agregar (empujar) elementos nuevos a un objeto?

Me aparece el siguiente error: Result of expression 'library.push' [undefined] is not a function(hacia la parte inferior de mi fragmento de código).

// 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(); 

Respuesta

42

library es un objeto, no una matriz. Empujas las cosas en las matrices. A diferencia de PHP, Javascript hace una distinción.

Su código intenta hacer una cadena que se parece al código fuente para un par de clave-valor, y luego "empujar" sobre el objeto. Eso ni siquiera está cerca de cómo funciona.

Lo que quiere hacer es agregar un nuevo par de clave-valor al objeto, donde la clave es el título y el valor es otro objeto. Esto se ve así:

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

"objeto JSON" es un término vago. Debe tener cuidado de distinguir entre un objeto real en la memoria de su programa y un fragmento de texto que está en formato JSON.

+0

Perfecto !! ¡Gracias! – Josiah

7

empuje es un método Array, durante JSON objeto puede que tenga que definirlo

esto debe hacerlo:

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

¡Adelante! ¡Gracias! – Josiah

11

Si su JSON es sin llave puede hacerlo de esta manera:

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

Así, intente esto:

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

Luego:

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