web-dev-qa-db-fra.com

Tableau associatif JavaScript vers JSON

Comment convertir un tableau associatif JavaScript en 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: "[]"
73
ActionOwl

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

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

> AssocArray.length
0

Ce qu'on appelle souvent "tableau associatif" n'est en réalité qu'un objet dans 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 sont accessibles via la notation de tableau ou la notation de point (si la clé n'est pas un mot clé réservé). Ainsi AssocArray.a est le même que AssocArray['a'].

136
Felix Kling

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

7
AndreKR

Convenu qu'il est probablement préférable de conserver les objets en tant qu'objets et les tableaux en tant que tableaux. Toutefois, si vous traitez un objet avec des propriétés nommées comme un tableau, voici comment procéder:

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

let json = JSON.stringify(tempArr);
4
user2245995

J'ai posté un correctif pour cela ici

Vous pouvez utiliser cette fonction pour modifier JSON.stringify pour encoder arrays, postez-le au début de votre script (consultez 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);
    };
})();
1
JVE999