2010-12-13 52 views
63

Comment convertir un tableau associatif JavaScript en JSON?Tableau associatif JavaScript au format JSON

J'ai essayé ce qui suit:

var AssocArray = new Array(); 

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

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

// result: "a = The letter A" 

JSON.stringify(AssocArray); 

// result: "[]" 

Répondre

119

Les tableaux ne doivent avoir des entrées avec les touches numériques (tableaux sont aussi des objets, mais vous devriez vraiment pas mélanger ces).

Si vous convertissez un tableau en JSON, le processus prendra uniquement en compte les propriétés numériques. Les autres propriétés sont simplement ignorées et c'est pourquoi vous obtenez un tableau vide comme résultat. Peut-être cela plus évident si vous regardez le length du tableau:

> AssocArray.length 
0 

Ce qui est souvent appelé « tableau associatif » est en fait un objet 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"}" 

Les propriétés des objets peuvent être accessible via la notation matricielle ou la notation par points (si la clé n'est pas un mot-clé réservé). Ainsi, AssocArray.a est identique à AssocArray['a'].

+3

Incorrect; les tableaux sont aussi des objets. 'Json.stringify' ignore les propriétés non-array des tableaux. – SLaks

+8

@SLaks: Je n'ai jamais dit que les tableaux ne sont pas des objets;) Je dis simplement qu'on ne peut pas utiliser un tableau comme tableau associatif (ok on pourrait le * parce qu'ils * sont * des objets, mais je pense confus et à la fin vous êtes responsable de l'effondrement de l'univers ...). –

+8

Juste pour clarifier la réponse: quand vous l'utilisez, utilisez {{} 'ou' new Object() ', ** NOT **' [] 'ou' new Array() ' – Thymine

7

Il n'y a pas de tableaux associatifs en JavaScript. Cependant, il y a des objets avec des propriétés nommées, donc n'initialisez pas votre "tableau" avec new Array, alors il devient un objet générique.

+0

Merci pour cela, simple et efficace! – Astravagrant

-1

Vous voudrez peut-être pousser l'objet dans le tableau

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

Quelle partie de ceci définit un tableau associatif? – GreensterRox

0

Je posté un correctif pour ce here

Vous pouvez utiliser cette fonction pour modifier JSON.stringify pour encoder arrays, juste après près du début de votre script (vérifiez le lien ci-dessus pour plus de détails):

// 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

Convenu qu'il est probablement préférable agir pour garder les objets en tant qu'objets et les tableaux en tant que tableaux. Toutefois, si vous avez un objet avec des propriétés nommées que vous traitez comme un tableau, voici comment cela peut être fait:

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

let json = JSON.stringify(tempArr);