JavaScript ассоциативный массив в JSON - PullRequest
73 голосов
/ 13 декабря 2010

Как я могу преобразовать ассоциативный массив JavaScript в JSON?

Я пробовал следующее:

var AssocArray = new Array();

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

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

// result: "a = The letter A"

JSON.stringify(AssocArray);

// result: "[]"

Ответы [ 5 ]

136 голосов
/ 13 декабря 2010

Массивы должны иметь записи только с цифровыми клавишами (массивы также являются объектами, но вам не следует смешивать их).

Если вы преобразуете массив в JSON, процесс будет учитывать только числовые свойства.Другие свойства просто игнорируются, и поэтому в результате вы получаете пустой массив.Может быть, это более очевидно, если взглянуть на length массива:

> AssocArray.length
0

То, что часто называют «ассоциативным массивом», на самом деле просто объект в 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"}"

Свойства объектов могут быть доступны через нотацию массива или точечную нотацию (если ключ не является зарезервированным ключевым словом).Таким образом, AssocArray.a совпадает с AssocArray['a'].

7 голосов
/ 13 декабря 2010

В JavaScript нет ассоциативных массивов. Однако есть объекты с именованными свойствами, поэтому просто не инициализируйте ваш «массив» с new Array, тогда он станет универсальным объектом.

4 голосов
/ 04 декабря 2017

Согласились, что, вероятно, лучше всего хранить объекты как объекты, а массивы - как массивы.Однако, если у вас есть Объект с именованными свойствами, который вы рассматриваете как массив, вот как это можно сделать:

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

let json = JSON.stringify(tempArr);
1 голос
/ 14 июля 2014

Я разместил исправление для этого здесь

Вы можете использовать эту функцию, чтобы изменить JSON.stringify для кодирования arrays, просто опубликуйте ее в начале вашего скрипта (проверьте ссылку выше для более подробной информации):

// 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);
    };
})();
0 голосов
/ 04 сентября 2012

Возможно, вы захотите поместить объект в массив

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