javascript - 谷歌脚本: i can not assign a value to a key of an object

标签 javascript object key

我在 JS 中有一个简单的对象,以年份为键,在月份内。每个月里面,我想存储信息。这是我的目标:

function generateYearMonths() {
  var firstYear = 2012;
  var todayDate = new Date(Date());
  var lastYear = todayDate.getYear();
  var yearsMonths = {}

  var months = {}

  for(var x=1; x<=12; x++) {
    months[x.toString()] = {
      totalExpenses: 0,
      totalIncomes: 0,
      totalBalance: 0
    }
  }

  for(var x=firstYear; x<=lastYear; x++) {
    yearsMonths[x] = months
  }

  return yearsMonths;
}

我想分配年份和月份,例如2012年1月,它们是键,值。我这样做:

yearsMonths[2012][1]["totalExpenses"] = 23;

并且值 23 被分配给每年的第 1 个月。我不明白错误在哪里。我第一次尝试 Google 脚本,我不知道我做错了什么,我只是想用值更新哈希。但对于每个年月对 key ,不要覆盖每个月。

请帮忙。

编辑 - 将月份移至年的循环中

function generateYearMonths() {
  var firstYear = 2012;
  var todayDate = new Date(Date());
  var lastYear = todayDate.getYear();
  lastYear = 2013;
  var yearsMonths = {}

  for(var x=firstYear; x<=lastYear; x++) {

    var months = {}

    for(var x=1; x<=12; x++) {
      months[x.toString()] = {
        totalExpenses: 0,
        totalIncomes: 0,
        totalBalance: 0
      }
    }
    yearsMonths[x] = months
  }

  return yearsMonths;
}

现在我不会为每个月分配相同的值,因为脚本无限运行......

最佳答案

在 Javascript 中,对象是通过引用传递的,而不是通过值传递的。在整个脚本中,您只能引用一个 var Months = {} 对象,因此当您这样做时

for(var x=firstYear; x<=lastYear; x++) {
  yearsMonths[x] = months
}

every yearMonths[x] 引用相同的单数 months 对象。相反,深度克隆 months,以确保 yearMonths 数组中的每个项目都引用唯一的对象:

for(var x=firstYear; x<=lastYear; x++) {
  yearsMonths[x] = JSON.parse(JSON.stringify(months));
}

关于javascript - 谷歌脚本: i can not assign a value to a key of an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575877/

相关文章:

javascript - CSS 仅将属性应用于第一个创建的元素

Javascript - 将字符串附加到包含点字符的对象的键

MySQL: 'EXPLAIN' 对类似查询显示不同的解释

javascript - 字符串类型的 "[object Object]"

java - 为什么我的对象保持为空?

c# - Windows 键的 SendKey 是什么

java - 二分查找和对两个数组使用 SortKey - 非常详细 [Java]

javascript - 这个JQuery代码可以写的更优雅

javascript - 407 需要代理身份验证(Forefront TMG 需要授权才能完成请求。对 Web 代理过滤器的访问被拒绝。)

javascript - 如何让Sinon.JS callCount 递增