【问题标题】:Convert a javascript associative array into json object using stringify and vice versa使用 stringify 将 javascript 关联数组转换为 json 对象,反之亦然
【发布时间】:2011-08-17 07:15:37
【问题描述】:

我有一个如下所示的 javascript 关联数组

 var my_cars= new Array()
 my_cars["cool"]="Mustang";
 my_cars["family"]="Station Wagon";
 my_cars["big"]="SUV";

我想使用 Stringify 将其转换为 json 对象。我想知道转换后的json对象是什么样子的。

还有当我有这个对象时,我如何将它再次转换回关联数组。

【问题讨论】:

  • 这些类型的数组在 javascript 中是禁止的。您应该只对像这样的非数字键使用对象。数组索引应该是数字。 Javascript 对象可以为键使用任意值(如您的示例中)。数组碰巧“看起来”可以工作,因为数组本身就是对象,但您不会发现普通的数组方法可以对它们起作用。
  • 换句话说:Javascript 没有“关联数组”。它有数组(数字索引)和对象。

标签: javascript json


【解决方案1】:

首先,通过将my_cars 设为一个数组并对其进行字符串化,您不会得到预期的结果。

var my_cars= new Array()
my_cars["cool"]="Mustang";
my_cars["family"]="Station Wagon";
my_cars["big"]="SUV";
alert(JSON.stringify(my_cars));

这会提醒[]

你想要的是以{}开头的:

var my_cars= {};
my_cars["cool"]="Mustang";
my_cars["family"]="Station Wagon";
my_cars["big"]="SUV";
alert(JSON.stringify(my_cars));

此提醒

{"cool":"Mustang","family":"Station Wagon","big":"SUV"}

要从字符串中取回您的对象,请使用JSON.parse()

var s = JSON.stringify(my_cars);
var c = JSON.parse(s);
alert(c.cool);

这会提醒“Mustang”。

http://jsfiddle.net/Y2De9/

【讨论】:

  • 谢谢雷。这就是我要搜索的内容。
  • 是的,我知道这有点晚了,但我今天刚刚在这里找到了您的解决方案,而且您确实让我的夜晚变得更短了。谢谢你。
  • 太棒了。谢谢雷。
【解决方案2】:

不,但是用户想使用数组而不是json。

普通 JavaScript 数组旨在保存具有数字索引的数据。您可以将命名键填充到它们上(当您想要存储有关包含正常、有序、数字索引数据的数组的元数据时,这可能很有用),但这不是它们的设计目的。 JSON 数组数据类型不能在数组上具有命名键。

如果您想要命名键,请使用对象,而不是数组。

*source

var test = [];           // Object
test[0] = 'test';        //this will be stringified

现在如果你想要数组中的键值对

test[1] = {};          // Array
test[1]['b']='item';
var json = JSON.stringify(test);

输出

"["test",{"b":"item"}]"

所以你可以使用数组的索引,或者

var my_cars= [];
my_cars[0]={};
my_cars[0]["cool"]="Mustang";
my_cars[1]={};
my_cars[1]["family"]="Station Wagon";
my_cars[2]={};
my_cars[2]["big"]="SUV";
console.log(JSON.stringify(my_cars));

输出

"[{"cool":"Mustang"},{"family":"Station Wagon"},{"big":"SUV"}]"

【讨论】:

    【解决方案3】:

    将我的评论移到答案中,以便我向您展示代码示例。

    这些类型的数组在 javascript 中是禁止使用的。您应该只对像这样的非数字键使用对象。数组索引应该是数字。 Javascript对象可以对键使用任意值(如您的示例中)。数组碰巧“看起来”可以工作,因为数组本身就是对象,但是您不会发现普通的数组方法可以对它们起作用。例如,看这个代码示例。

    var my_cars= new Array()
    my_cars["cool"]="Mustang";
    my_cars["family"]="Station Wagon";
    my_cars["big"]="SUV";
    alert(my_cars.length);  // alerts 0
    

    您只向底层对象添加了属性,并未实际向数组添加元素。您应该为此使用对象,而不是数组。 Javascript 实际上没有关联数组。它有一个对象,其属性通常可以像在其他语言中使用关联数组一样使用。但是,它是一个对象,而不是一个数组。

    【讨论】:

    • 确实,数组元素永远不会被赋值。数组毕竟是空的。
    【解决方案4】:

    "JavaScript does not support arrays with named indexes"

    与关联数组最接近的状态是条目转换为属性的数组(如您的情况),因此我为这种确切情况提供了解决方案。

    有趣的是,Chrome 的控制台让它感觉像是一个关联数组:["cool":"Mustang", "family":"Station Wagon", "big":"SUV"](请咨询F12

    注意:在运行 sn-p 之前打开浏览器的控制台

    var my_cars= new Array()
    my_cars["cool"]="Mustang";
    my_cars["family"]="Station Wagon";
    my_cars["big"]="SUV";
    
    
    let toAssociative=(keys, values)=> 
        values.reduce((acc, cv)=>{
           acc[acc.shift()]=cv
           return acc;
        }, keys)    
    
    
    let fromAssociative = (assArr)=>({...assArr})
    
    let serialized = JSON.stringify(fromAssociative(my_cars))
    
    let o = JSON.parse(serialized)
    
    let restored = toAssociative(Object.keys(o) , Object.values(o))
    
    //NOTE: Look at the browser's console before executing (not SO console)
    
    console.log("orig:",my_cars) 
    //[cool: "Mustang", family: "Station Wagon", big: "SUV"]
    
    console.log("serialized:",serialized)
    //{"cool":"Mustang","family":"Station Wagon","big":"SUV"}
     
    console.log("restored:",restored) //NOTE: look at the browser's console (F12)
    //[cool: "Mustang", family: "Station Wagon", big: "SUV"]

    【讨论】:

      【解决方案5】:

      如果由于某种原因您无法将数组转换为对象,例如您正在处理一个大型框架或不想接触的遗留代码,并且您的工作只是添加需要使用 JSON API 的 som 功能,您应该考虑使用 API 的 JSON.stringify(json,function(k,v){}) 版本。 在函数中,您现在可以决定如何处理特定类型的键值。

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 2020-05-12
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多