【问题标题】:Google Script: i can not assign a value to a key of an object谷歌脚本:我无法为对象的键赋值
【发布时间】:2018-07-28 22:56:54
【问题描述】:

我在 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 个月。我不明白错误在哪里。我第一次尝试谷歌脚本,我不知道我做错了什么,我只想用值更新哈希。但是对于每个年月对密钥,不要覆盖每个月。

请帮忙。

编辑 -- 将月份移动到循环形式年份

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;
}

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

【问题讨论】:

  • 那是因为你在yearsMonths[x] = months 行中的所有年份都分配给同一个对象months。它们都是同一个对象,因此一年内对 months 的任何更改都会反映在所有年份中

标签: javascript object key


【解决方案1】:

对象在 Javascript 中通过 reference 传递,而不是通过值传递。在整个脚本中你只引用了一个 var months = {} 对象,所以当你这样做时

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

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

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

【讨论】:

  • 我已经在每年的循环中移动了 var months = {} 和 12 个月的循环。这样,我在每年循环中初始化一个变量。但它不起作用。我不是每次做 var 时都初始化一个新变量吗?
  • 成功了。有替代方案吗?那么 stringify 会创建一个新对象吗?
  • 是的,字符串化然后解析该字符串会创建对象的深层副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多