【问题标题】:Javascript's JSON.stringify doesn't take key-indexed (associative) arrays?Javascript JSON.stringify 不采用键索引(关联)数组?
【发布时间】:2014-08-21 09:04:54
【问题描述】:

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

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

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

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

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

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

this jsfiddle example。是我做错了什么,还是我误解了数组的工作原理?

【问题讨论】:

标签: javascript arrays json object stringify


【解决方案1】:

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

var b = []; 在尝试创建对象时显式声明一个数组。

Javascript中的数组只能包含Arrays的Index方式,而Objects更多的是 关联数组。

如果你把var b = [];改成var b = {};就可以解决问题了。

var b = {} 显式声明一个对象。

【讨论】:

【解决方案2】:

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

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

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

向数组对象添加参数并没有错,但它们不是数组的一部分,处理数组的函数或方法可能会忽略它们或任意处理它们。您已经看到 JSON.stringify 忽略了附加参数。其他功能可能会以其他方式执行 - 您必须在每种情况下找出。

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

而不是:

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

你可能会使用:

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

【讨论】:

    【解决方案3】:

    此快照来自 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);
    

    现在解决您的问题:

    注意:谷歌浏览器的控制台给出了不同的结果,这是谷歌浏览器的一个错误。

    【讨论】:

    • 这不是 IE 的错误吗? (通常是......)简单地说,这是否说你好: var b=[]; b['x']='你好';警报(b['x']);
    • 但这不是向数组插入值的方式(查看 javascript 的 api 文档)。此外,javascript 中的一切都是对象,因此 b['x'] 表示法对于在数组中插入值是有效的,因为 javascript 认为创建了与对象相对应的键值对.. 但是一旦确定 b 是一个数组,它不会在数组中插入值。所以在这种情况下数组将始终为空。因此 JSON.stringify() 返回空数组。 JSON.stringify() 不会错先生。
    • 始终记住任何语言的数组都接受与索引对应的值。这是编程语法
    猜你喜欢
    • 2014-10-14
    • 2012-03-18
    • 2020-12-06
    • 2014-04-03
    • 2012-02-11
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多