2010-12-13 17 views
63

¿Cómo puedo convertir una matriz asociativa JavaScript en JSON?JavaScript matriz asociativa a JSON

He intentado lo siguiente:

var AssocArray = new Array(); 

AssocArray["a"] = "The letter A" 

console.log("a = " + AssocArray["a"]); 

// result: "a = The letter A" 

JSON.stringify(AssocArray); 

// result: "[]" 

Respuesta

119

matrices sólo deben tener entradas con las teclas numéricas (arrays también son objetos, pero que realmente no se deben mezclar estos).

Si convierte una matriz a JSON, el proceso solo tendrá en cuenta las propiedades numéricas. Otras propiedades simplemente se ignoran y es por eso que obtienes una matriz vacía como resultado. Tal vez esto más evidente si nos fijamos en la length de la matriz:

> AssocArray.length 
0 

Lo que se refiere a menudo como "matriz asociativa" es en realidad sólo un objeto en JS:

var AssocArray = {}; // <- initialize an object, not an array 
AssocArray["a"] = "The letter A" 

console.log("a = " + AssocArray["a"]); // "a = The letter A" 
JSON.stringify(AssocArray); // "{"a":"The letter A"}" 

propiedades de los objetos puede acceder a través de la notación de matriz o punto (si la clave no es una palabra clave reservada). Por lo tanto, AssocArray.a es el mismo que AssocArray['a'].

+3

Incorrecto; las matrices también son objetos. 'Json.stringify' ignora las propiedades que no son de matriz de las matrices. – SLaks

+8

@SLaks: nunca dije que las matrices no son objetos;) Solo digo que no se puede usar una matriz como una matriz asociativa (bueno, probablemente se podría * porque * ellos * son * objetos, pero creo que esto se pone muy feo y confuso y al final eres responsable del colapso del universo ...). –

+8

Solo para aclarar la respuesta: cuando lo inicialice use '{}' o 'nuevo Objeto()', ** NO ** '[]' o 'nuevo Array()' – Thymine

7

No hay matrices asociativas en JavaScript. Sin embargo, hay objetos con propiedades con nombre, por lo que simplemente no inicialice su "matriz" con new Array, entonces se convierte en un objeto genérico.

+0

¡Gracias por esto, simple y efectivo! – Astravagrant

-1

Es posible que desee empujar el objeto en la matriz

enter code here 

var AssocArray = new Array(); 

AssocArray.push("The letter A"); 

console.log("a = " + AssocArray[0]); 

// result: "a = The letter A" 

console.log(AssocArray[0]); 

JSON.stringify(AssocArray); 
+0

¿Qué parte de esto define una matriz asociativa? – GreensterRox

0

he publicado una solución para este here

Puede utilizar esta función para modificar JSON.stringify para codificar arrays, poste justo cerca del comienzo de su secuencia de comandos (consulte el enlace de arriba para obtener más detalles):

// Upgrade for JSON.stringify, updated to allow arrays 
(function(){ 
    // Convert array to object 
    var convArrToObj = function(array){ 
     var thisEleObj = new Object(); 
     if(typeof array == "object"){ 
      for(var i in array){ 
       var thisEle = convArrToObj(array[i]); 
       thisEleObj[i] = thisEle; 
      } 
     }else { 
      thisEleObj = array; 
     } 
     return thisEleObj; 
    }; 
    var oldJSONStringify = JSON.stringify; 
    JSON.stringify = function(input){ 
     if(oldJSONStringify(input) == '[]') 
      return oldJSONStringify(convArrToObj(input)); 
     else 
      return oldJSONStringify(input); 
    }; 
})(); 
2

Estoy de acuerdo que es probable que sea actice para mantener los Objetos como objetos y Arrays como matrices. Sin embargo, si tiene un Objeto con propiedades con nombre que está tratando como una matriz, así es cómo se puede hacer:

let tempArr = []; 
Object.keys(objectArr).forEach((element) => { 
    tempArr.push(objectArr[element]); 
}); 

let json = JSON.stringify(tempArr); 
Cuestiones relacionadas