【问题标题】:Array of Array, JSON.stringify() giving empty array instead of entire object数组数组,JSON.stringify() 给出空数组而不是整个对象
【发布时间】:2026-02-23 19:20:03
【问题描述】:

这是我的数组(来自 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 JSONConvert javascript object or array to json for ajax data 但问题仍然存在。

【问题讨论】:

  • 你能在 jsfiddle.net 上做一个活生生的例子吗?
  • 您从哪里获得小时数?看起来不像是一个js数组,更像是一个对象..
  • 你有一个伪装成数组的对象 - length 表示零并且属性被命名。
  • 当您实际需要对象 ({}) 时,您似乎已经创建了数组 ([])。在 JavaScript 中,如果您想使用非数字键(例如“11h30”),则需要使用对象。
  • passing an array to json.stringify 的可能重复项,虽然那里的答案没有详细说明为什么对象与数组相比是必需的。

标签: javascript arrays json object


【解决方案1】:

你可以使用

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

和吝啬新地图。结果解析为 Map

【讨论】:

    【解决方案2】:

    在 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]);
      }
    }
    

    【讨论】:

      【解决方案3】:

      像所有 JavaScript 对象一样,数组可以具有 properties 和基于字符串的键,就像你正在使用的那样。但是只有整数键(或可以干净地转换为整数的键)实际上被视为数组的元素。这就是 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"
          }, 
      }
      

      【讨论】:

      • 是的,但是我的表单几乎是完全动态的,所以我不能使用这个解决方案。
      【解决方案4】:

      这是重现问题的最少 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"}
      

      【讨论】:

      • 正是我需要的!谢谢你:)
      • var fixed = Object.assign({},test); 如果您无法追踪数组的调用方式或无法控制它,似乎可以“修复”它。