【问题标题】:js array to json but some value disappearjs数组到json但一些值消失了
【发布时间】:2016-09-04 22:46:10
【问题描述】:
window.onload = function() {
  var arr = new Array;
  var jsonObj = {
    "123": "234"
  };
  arr['v'] = "234";
  arr[0] = jsonObj;
  arr[1] = jsonObj;
  console.log(JSON.stringify(arr));
}

上面的代码结果是:

[{"123":"234"},{"123":"234"}]

不知道arr['v']为什么消失了?

【问题讨论】:

标签: javascript arrays json


【解决方案1】:

ObjectArray 解析为 JSON 的方式不同。

Array 将仅包括数字键,Object 将包括其所有键:

var Arr = [], Obj ={};

Arr[0] = Obj[0] = 'a';
Arr[1] = Obj[2] = 'b';
Arr['key'] = Obj['key'] = 'c';

console.log(JSON.stringify(Arr));
console.log(JSON.stringify(Obj));

所以在您的情况下,您可以简单地使用 Onject 而不是数组:

var arr = new Object;
var jsonObj = {"123":"234"};
arr['v'] = "234";
arr[0] = jsonObj;
arr[1] = jsonObj;
console.log(JSON.stringify(arr));

【讨论】:

    【解决方案2】:

    实际上,JSON.stringify 在 Array JSON 序列化过程中会忽略 Array 中的非数字键。从最新的 ECMA 规范中的"24.3.2.4 Runtime Semantics: SerializeJSONArray ( value )" 部分,我们知道 JSON.stringify 仅利用 Array 的长度和相关的数字键来进行序列化,而 Array 长度不受其非数字键的影响。所以现在很清楚为什么“v”(非数字键)会在最终结果中消失。

    【讨论】:

      【解决方案3】:

      您不能将字符串用作数组索引,除非它是整数的字符串表示形式。

      因此,arr['v'] 没有意义。

      This stackoverflow question 更详细,但相关部分:

      是的,从技术上讲,数组索引是字符串,但就像 Flanagan 一样优雅 把它放在他的“权威指南”中:

      "区分数组索引和对象是有帮助的 属性名称。所有索引都是属性名称,但只有属性名称 0 到 232-1 之间的整数是索引。”

      【讨论】:

        【解决方案4】:

        在 JavaScript 中,基本上有两种类型的数组,标准数组和关联数组。标准数组由 [] 定义,因此基于 0 的类型索引。并且在关联数组中由 {} 定义,在这种情况下,您可以将字符串定义为键。因此,在您的代码中,您使用的都是单个数组,这是不可接受的。因此,如果您想要字符串键,请定义另一个数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多