【问题标题】:For-each loop in google apps script谷歌应用程序脚本中的 for-each 循环
【发布时间】:2017-10-11 16:40:59
【问题描述】:

如何在 Google Apps 脚本中创建 for-each 循环?

我正在使用 GAS 编写电子邮件脚本,我想使用 for-each 循环而不是常规的 for 循环来迭代数组。
我已经看过this的回答,但是对象是未定义的,大概是因为for循环不起作用。

// threads is a GmailThread[]
for (var thread in threads) {
  var msgs = thread.getMessages();
  //msgs is a GmailMessage[]
  for (var msg in msgs) {
    msg.somemethod(); //somemethod is undefined, because msg is undefined.
  }
}


(我还是 javascript 的新手,但我知道 java 的 for-each 循环。)

【问题讨论】:

  • for (var thread of threads) { var msgs = thread.getMessages(); //msgs 是一个 GmailMessage[] for (var msg in msgs) { ... } }
  • for...in 迭代对象的键,而不是它的值。这种模式在 JS 中是不鼓励的,因为它将包含添加到数组的自定义原型。如果你想要一个更优雅的解决方案,我建议thread.map(handleThread) 或类似的东西
  • '在更高版本的 javaScript 中,forEach 方法被添加到 Array 对象中。 Google Apps 脚本使用的 JavaScript 引擎提供了这种模式。来自ramblings.mcpher.com/Home/excelquirks/gooscript/loops。请参阅下面的答案。
  • 好的,我已经纠正了

标签: javascript google-apps-script


【解决方案1】:

更新:有关将脚本迁移到 V8 运行时的更新,请参阅下面的 @BBau 回答 https://stackoverflow.com/a/60785941/5648223

在 Google Apps 脚本中: 使用“for (var item in itemArray)”时, 'item' 将是整个循环中 itemArray 的索引 (0, 1, 2, 3, ...)。 当使用“for each (var item in itemArray)”时, 'item' 将是整个循环中 itemArray 的值('item0', “项目 1”、“项目 2”、“项目 3”、...)。

例子:

function myFunction() {
  var arrayInfo = [];
  
  arrayInfo.push('apple');
  arrayInfo.push('orange');
  arrayInfo.push('grapefruit');
  
  Logger.log('Printing array info using for loop.');
  for (var index in arrayInfo)
  {
    Logger.log(index);
  }
  Logger.log('Printing array info using for each loop.');
  for each (var info in arrayInfo)
  {
    Logger.log(info);
  }
}

结果:

[17-10-16 23:34:47:724 EDT] 使用 for 循环打印数组信息。 [美国东部时间 17-10-16 23:34:47:725] 0 [美国东部时间 17-10-16 23:34:47:725] 1 [美国东部时间 17-10-16 23:34:47:726] 2 [17-10-16 23:34:47:726 EDT] 使用每个循环打印数组信息。 [17-10-16 23:34:47:727 EDT] 苹果 [17-10-16 23:34:47:728 EDT] 橙色 [17-10-16 23:34:47:728 EDT] 葡萄柚

【讨论】:

  • 好答案。更短的版本...for each (var ColNum in [5,"hh",7]) { Logger.log(ColNum); }
  • 这里不应该使用这个,因为Array类方法可用,例如Array#forEachArray#map
  • for each 的东西很有趣,因为它不是标准的 JavaScript(对吗?),但 Array#forEach 不适用于我的用例,因为我需要从循环内部返回。我认为这相当于 ES6 中的 for (... of ...)
【解决方案2】:

在新的 V8 运行时中,Google 删除了 for each 循环。 (V8 migration)

V8 Syntax

// V8 runtime
var obj = {a: 1, b: 2, c: 3};

for (var key in obj) {  // OK in V8
  var value = obj[key];
  Logger.log("value = %s", value);
}

旧语法 已弃用

// Rhino runtime
var obj = {a: 1, b: 2, c: 3};

// Don't use 'for each' in V8
for each (var value in obj) {
  Logger.log("value = %s", value);
}

【讨论】:

  • 我认为这是更好和最新的答案。 for eachV8不兼容,我们应该避免使用它。
【解决方案3】:

From MDN, The for...in statement iterates over the enumerable properties of an object, in original insertion order. For each distinct property, statements can be executed. 所以你不需要for...in 声明。您可以使用forEach(),它为每个数组元素执行一次提供的函数,尽管您的问题中没有函数,所以也许这不是您想要的。 map() 是另一种选择,但它也需要一个函数, map() 方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 2022-01-25
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多