Array的数组,JSON.stringify()给出空数组而不是整个对象

时间:2015-02-13 13:35:08

标签: javascript arrays json object

这是我的阵列(来自Chrome控制台):

array in Chrome console

以下是代码的相关部分:

console.log(hours);
var data = JSON.stringify(hours);
console.log(data);

在Chrome的控制台中,我从最后一行获得[]。我应该得到{'Mon':{...}...}

以下是重现此问题的最小JavaScript数量:

var test = [];
test["11h30"] = "15h00"
test["18h30"] = "21h30"
console.log(test);    
console.log(JSON.stringify(test)); // outputs []

我尝试过其他类似的东西 Convert array to JSONConvert javascript object or array to json for ajax data,但问题仍然存在。

4 个答案:

答案 0 :(得分:18)

以下是重现问题的最小javascript数量

var test = [];
test["11h30"] = "15h00"
test["18h30"] = "21h30"
console.log(test);    
console.log(JSON.stringify(test)); // outputs []

上面的问题是,虽然javascript很乐意让你将新属性绑定到Array,但JSON.stringify()只会尝试序列化数组中的实际元素。

使对象成为实际对象的最小更改,JSON.stringify按预期工作:

var test = {}; // here is thre only change. new array ([]) becomes new object ({})
test["11h30"] = "15h00"
test["18h30"] = "21h30"
console.log(test);
console.log(JSON.stringify(test)); // outputs {"11h30":"15h00","18h30":"21h30"}

答案 1 :(得分:1)

与所有JavaScript对象一样,Arrays可以包含属性,其中包含基于字符串的键,就像您正在使用的那样。但只有整数键(或可以干净地转换为整数的键)实际上被视为数组的元素 。这就是为什么JSON没有捕获你的属性,这也是为什么你的Arrays都将它们的长度报告为零的原因。

如果你真的需要使用非整数键,你应该使用普通的对象,而不是数组。这个方法有它自己的问题 - 例如,你需要小心使用for-in循环 - 但JSON将按照你期望的方式工作。

var hours = {
    "Mon" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
    "Tue" : {},
    "Wed" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
    "Thu" : {},
    "Fri" : {},
    "Sat" : {},
    "Sun" : {
        "11h30" : "15h00",
        "18h30" : "21h30"
    }, 
}

答案 2 :(得分:1)

在javascript数组中,索引是数字键。 JSON.stringify假定数组只有数字属性。

你想使用一个对象,因为你拥有的不是数组,而是类似于字典。

这是我做的一个例子: http://jsfiddle.net/developerwithacaffeineproblem/pmxt8bwf/2/

object = Object()
object["age"] = 1
object["cars"] = 2
object["girlfriends"] = 3

JSON.stringify(object)

结果:
    “{” 年龄 “:1,” 汽车 “:2”,女朋友 “:3}”

之后解析数据时,如果要迭代它,可以使用一段与此类似的代码:

for (var key in yourobject) {
  if (yourobject.hasOwnProperty(key)) {
     console.log(key, yourobject[key]);
  }
}

答案 3 :(得分:-1)

您可以使用

const newMap = JSON.parse('{}');
newMap[name] = value;

并控制newMap。结果是pars为Map