Javascript的JSON.stringify没有采用密钥索引(关联)数组?

时间:2014-08-21 09:04:54

标签: javascript arrays json object stringify

在JavaScript中,您可以拥有对象,如下所示:

var a = { foo: 12, bar: 34 };

带有键(命名)索引的数组,如下所示:

var b = [];
b['foo'] = 56;
b['bar'] = 78;

它们有点相似,但显然不一样。

现在奇怪的是,JSON.stringify似乎没有接受数组。没有错误或任何东西,JSON.stringify(b)只会产生[]。

this jsfiddle example。我做错了什么,或者我只是误解了数组是如何工作的?

3 个答案:

答案 0 :(得分:5)

Javascript不支持关联数组(如PHP)。

var b = [];当您尝试创建对象时,明确声明一个数组。

Javascript中的数组只能包含数组的索引方法,而对象则更多 关联数组。

如果您将var b = [];更改为var b = {};,则会解决问题。

var b = {}明确声明对象。

答案 1 :(得分:4)

Javascript数组是对象。有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Predefined_Core_Objects#Array_Object

  

注意:如果为数组运算符提供非整数值   上面的代码,将在表示对象的对象中创建一个属性   数组,而不是数组元素。

JSON仅支持Javascript的一个子集。有关详细信息,请参阅http://www.json.org/

  

JSON基于两种结构:

     
      
  • 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控   列表或关联数组。
  •   
  • 有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。
  •   

具有在底层对象中创建的属性的Javascript数组不适合这些结构中的任何一个,因为它具有名称/值对的集合和有序的值列表,因此没有简单的方法来表示这样的直接在JSON中对象。

JSON.stringify方法在ECMAScript规范中定义。例如,请参阅http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3

虽然有很多细节,但这里的相关位是对象值的字符串化方式:

  

如果Type(value)是Object,并且IsCallable(value)是false

     
      
  • 如果值的[[Class]]内部属性为“Array”,则返回使用参数值调用抽象操作JA的结果。
  •   
  • 否则,返回使用参数值调用抽象操作JO的结果。
  •   

给定您的数组,尽管向底层对象添加了参数,但结果是对有序的数组元素进行字符串化,而不是基础对象。

向数组对象添加参数没有任何问题,但它们不是数组的一部分,处理数组的函数或方法可能会忽略它们或任意处理它们。您已经看到JSON.stringify忽略了其他参数。其他功能也可能不这样做 - 你必须在每种情况下都找到它。

虽然没有错,但如果不向数组对象添加属性,可能会更容易理解。如果要添加属性,请从非数组对象开始。

而不是:

var b = [];
b['foo'] = 56;
b['bar'] = 78;

您可以使用:

var b = {};
b['foo'] = 56;
b['bar'] = 78;

答案 2 :(得分:1)

enter image description here

此快照来自IE浏览器。看到数组仍然是空白的。

实际上,将元素插入数组的方法是:

<强> 1。使用push() 的 2。在声明期间插入数组中的元素

如果要对数组进行字符串化,则必须在数组中包含数据。

所以,现在你想要对键值对进行字符串化,所以你必须将对象作为JSON.stringify()的参数传递,如下所示:

var test = {};           // Object
test['a'] = 'test';
test['b'] = [];          // Array
test['b'].push('item');
test['b'].push('item2');
test['b'].push('item3');
var json = JSON.stringify(test);
alert(json);

现在解决您的问题:

enter image description here

注意:Google Chrome控制台提供的结果不同,这是Google Chrome中的一个错误。