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: "[]"

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'].


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.


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

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

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

Welcher Teil davon definiert ein assoziatives Array?
GreensterRox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.