Assoziatives JavaScript-Array für JSON

77

Wie kann ich ein assoziatives JavaScript-Array in JSON konvertieren?

Ich habe folgendes versucht:

var AssocArray = new Array();

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

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

// result: "a = The letter A"

JSON.stringify(AssocArray);

// result: "[]"
ActionOwl
quelle

Antworten:

142

Arrays sollten nur Einträge mit numerischen Schlüsseln haben (Arrays sind auch Objekte, aber Sie sollten diese wirklich nicht mischen).

Wenn Sie ein Array in JSON konvertieren, berücksichtigt der Prozess nur numerische Eigenschaften. Andere Eigenschaften werden einfach ignoriert und deshalb erhalten Sie als Ergebnis ein leeres Array. Vielleicht ist dies offensichtlicher, wenn Sie sich lengthdas Array ansehen :

> AssocArray.length
0

Was oft als "assoziatives Array" bezeichnet wird, ist in JS eigentlich nur ein Objekt:

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

Auf Eigenschaften von Objekten kann über die Array- oder Punktnotation zugegriffen werden (wenn der Schlüssel kein reserviertes Schlüsselwort ist). Also AssocArray.aist das gleiche wie AssocArray['a'].

Felix Kling
quelle
3
Falsch; Arrays sind auch Objekte. Json.stringifyignoriert Nicht-Array-Eigenschaften von Arrays.
SLaks
9
@SLaks: Ich habe nie gesagt , dass Arrays sind nicht Objekte;) Ich sage nur , dass man nicht einen Array als assoziatives Array verwenden kann (ok wahrscheinlich könnte man denn sie sind Objekte, aber ich denke , das ist wirklich hässlich bekommt und verwirrend und am Ende Sie sind verantwortlich für den Zusammenbruch des Universums ...).
Felix Kling
13
Nur um die Antwort zu verdeutlichen: Wenn Sie es initialisieren, verwenden Sie {}oder new Object(), NICHT [] odernew Array()
Thymine
1
@ Thymines Kommentar ist am wertvollsten! Achten Sie darauf, wie Sie Daten in Javascript initialisieren. Verwenden Sie {} (!!!)
Eugene Kapustin
8

In JavaScript gibt es keine assoziativen Arrays. Es gibt jedoch Objekte mit benannten Eigenschaften. Initialisieren Sie Ihr "Array" also nicht mit new Array, es wird dann zu einem generischen Objekt.

AndreKR
quelle
Danke dafür, einfach und effektiv!
Astravagrant
4

Einverstanden, dass es wahrscheinlich die beste Vorgehensweise ist, Objekte als Objekte und Arrays als Arrays beizubehalten. Wenn Sie jedoch ein Objekt mit benannten Eigenschaften haben, das Sie als Array behandeln, können Sie dies folgendermaßen tun:

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

let json = JSON.stringify(tempArr);
Killer_Kohlrabi
quelle
2

Ich schrieb einen Fix für dieses hier

Sie können diese Funktion verwenden, um JSON.stringifydie Codierung zu ändern. Veröffentlichen Sie sie arrayseinfach am Anfang Ihres Skripts (weitere Informationen finden Sie unter dem obigen Link):

// 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);
    };
})();
JVE999
quelle
-1

Möglicherweise möchten Sie das Objekt in das Array verschieben

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);
Yene Mulatu
quelle
Welcher Teil davon definiert ein assoziatives Array?
GreensterRox