【问题标题】:JavaScript associative array to JSONJavaScript 关联数组到 JSON
【发布时间】:2011-05-24 10:36:22
【问题描述】:

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

【问题讨论】:

    标签: javascript json associative-array


    【解决方案1】:

    数组应该只有带有数字键的条目(数组也是对象,但你真的不应该混合这些)。

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

    【讨论】:

    • 不正确;数组也是对象。 Json.stringify 忽略数组的非数组属性。
    • @SLaks:我从来没有说过数组不是对象;)我只是说不能将数组用作关联数组(好吧,也许可以因为它们是对象,但我认为这变得非常丑陋和令人困惑,最终你要为宇宙的崩溃负责......)。
    • 只是为了澄清答案:当你初始化它时使用{}或new Object(),NOT[]或new Array()
    • @Thymine 的评论最有价值!请注意如何在 javascript 中初始化数据。使用 {} (!!!)
    【解决方案2】:

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

    【讨论】:

    • 感谢这个,简单有效!
    【解决方案3】:

    您可能希望将对象推入数组中

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

    【讨论】:

    • 这一部分定义了关联数组?
    【解决方案4】:

    我为此here发布了一个修复程序

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

    【讨论】:

      【解决方案5】:

      同意将对象保留为对象并将数组保留为数组可能是最佳实践。但是,如果您有一个带有命名属性的对象,您将其视为一个数组,那么可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多