2010-12-13 18 views
63

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

Ich habe versucht, die folgenden:

var AssocArray = new Array(); 

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

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

// result: "a = The letter A" 

JSON.stringify(AssocArray); 

// result: "[]" 

Antwort

119

Arrays sollten nur Einträge haben mit Zifferntasten (Arrays sind auch Objekte, aber Sie sollten wirklich diese 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 noch deutlicher, wenn man die length des Arrays zu buchen:

> AssocArray.length 
0 

Was oft als „assoziatives Array“ bezeichnet wird, ist eigentlich nur ein Objekt in 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"}" 

Eigenschaften von Objekten können Zugriff über Array-Notation oder Punktnotation (wenn der Schlüssel kein reserviertes Schlüsselwort ist). Somit ist AssocArray.a dasselbe wie AssocArray['a'].

+3

Inkorrekt; Arrays sind auch Objekte. 'Json.stringify' ignoriert Nicht-Array-Eigenschaften von Arrays. – SLaks

+8

@SLaks: Ich habe nie gesagt, dass Arrays keine Objekte sind;) Ich sage nur, dass man ein Array nicht als assoziatives Array verwenden kann (ok wahrscheinlich könnte man * weil * sie * sind * Objekte, aber ich denke, das wird wirklich hässlich und verwirrend und am Ende bist du verantwortlich für den Zusammenbruch des Universums ...). –

+8

Nur um die Antwort zu klären: Wenn Sie es initialisieren, verwenden Sie '{}' oder 'new Object()', ** NOT ** '[]' oder 'new Array()' – Thymine

7

In JavaScript gibt es keine assoziativen Arrays. Es gibt jedoch Objekte mit benannten Eigenschaften, also initialisiere dein "Array" einfach nicht mit new Array, dann wird es ein generisches Objekt.

+0

Danke dafür, einfach und effektiv! – Astravagrant

-1

Sie könnten das Objekt in das Array

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

Welcher Teil davon definiert ein assoziatives Array? – GreensterRox

0

ich für diese Sie here

einen Fix veröffentlicht schieben wollen diese Funktion JSON.stringify verändern können arrays zu kodieren, Posten nur es am Anfang des Skripts (für weitere Informationen überprüfen sie den Link oben):

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

vereinbart, dass es wahrscheinlich am besten pr Aktivieren Sie Objekte als Objekte und Arrays als Arrays. Wenn Sie jedoch ein Objekt mit benannten Eigenschaften haben, die Sie als Array behandeln, können Sie Folgendes tun:

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

let json = JSON.stringify(tempArr);