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

Array of Array, JSON.stringify() giving empty array instead of entire object

这是我的数组(来自 Chrome 控制台):

这是代码的相关部分:

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 JSON or Convert javascript object or array to json for ajax data 但问题依旧。

这里是重现问题的最小数量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"}

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

如果你真的需要使用非整数键,你应该使用普通对象,而不是数组。此方法有其自身的陷阱 - 例如,您需要小心使用 for-in 循环 - 但 JSON 将按您期望的方式工作。

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

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

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

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

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

JSON.stringify(object)

结果:
“{"age":1,"cars":2,"girlfriends":3}”

之后当你解析数据时,如果你想迭代它,你可以使用一段类似于这样的代码:

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

你可以使用

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

和 stingfy newMap。结果是 pars as Map