JavaScript关联数组到JSON


78

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

Answers:


143

数组只能包含带有数字键的条目(数组也是对象,但您实际上不应该将它们混合使用)。

如果将数组转换为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']


3
不正确;数组也是对象。Json.stringify忽略数组的非数组属性。
SLaks 2010年

9
@SLaks:我从没说过数组不是对象;)我只是说一个人不能使用数组作为关联数组(可以的,可能是因为它们对象,但是我认为这确实很丑陋和令人困惑,最终你对宇宙的崩溃负有责任...)。
菲利克斯·克林

13
只是为了澄清答案:当您将其{}new Object() []new Array()
胸腺嘧啶

1
@胸腺的评论最有价值!请注意如何在javascript中初始化数据。使用{}(!!!)
Eugene Kapustin,

8

JavaScript中没有关联数组。但是,有些对象具有命名属性,因此,不要使用初始化您的“数组” new Array,它就会变成通用对象。


谢谢您,简单有效!
Astravagrant

4

同意将对象保留为对象,将数组保留为数组可能是最佳实践。但是,如果您有一个具有命名属性的对象,您将其视为数组,则可以通过以下方法完成:

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

let json = JSON.stringify(tempArr);

2

我在这里发布了修复程序

您可以使用此函数进行修改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);
    };
})();

-1

您可能需要将对象推入数组

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

哪一部分定义了关联数组?
GreensterRox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.