【问题标题】:Iterating through multiple arrays in Javascript without using indices在不使用索引的情况下迭代 Javascript 中的多个数组
【发布时间】:2018-10-06 15:20:47
【问题描述】:

我正在尝试使用单个“for in”或“for each”循环遍历多个数组。

我有三个数组,分别是 nameid available。这些数组的大小是相等的。

我需要做的是,我需要遍历上述数组的每个值,并根据行和列的索引(分别为 i 和 j 的值),将元素的值复制到一个单元格在电子表格中。

以下是我正在使用的代码:

for (i = 1; i <= copy_range.getNumRows(); i++) {
  for (j = 1; j <= copy_range.getNumColumns(); j++) {
    if (j == 1) {
      var name_cell = copy_range.getCell(i, j);
      // I want to do this however I'm not able to do this since I already have i and j for
      // row and column iteration and that another nested loop makes things complicated
      name_cell.setValue(name[k]);
    }
    else if (j == 2) {
      var id_cell = copy_range.getCell(i, j);
      Logger.log(id_cell.getA1Notation());
      id_cell.setValue(id[k]); //Same idea as in previous if
    }
    else {
      var availability_cell = copy_range.getCell(i, j);
      Logger.log(availability_cell.getA1Notation());
      availability_cell.setValue(available[k]); //Same as if and else if loops previously.
    }
  }   

我不能使用索引的原因是我已经使用 ij 作为迭代变量来引用行和列,并且使用另一个嵌套循环不会给我预期的输出 - 它导致不必要的迭代和执行时间。

请告诉我是否有任何方法可以使用“for in”或类似的循环来迭代所有三个数组的每个项目。

【问题讨论】:

  • 您能分享您的电子表格吗?我很乐意为您提供帮助。?
  • 你没有说 k 是什么或它与 i 和 j 的关系。 k 是否与 i 或 i 加一些数字相同?您还应该查看最佳实践developers.google.com/apps-script/guides/support/best-practices,多次调用 setValue 会降低性能。你似乎对每一个 i 和 j 都是 setValue(),为什么不建立一个 2D 数组然后使用 setValues(array)。
  • 不要将for in 用于数组。根本不要使用for each(var...
  • 另外我想指出 cell.setValue() 中的单元格没有在你的循环中定义。您是说 name_cell、id_cell 和 availability_cell 吗?
  • 您的代码目前非常复杂,只是因为对 .setValue 的多次调用。这将很快降低您的脚本速度,.getValue 或其他必须访问电子表格的方法也是如此。而不是您的解决方案,前进的最佳方法是创建某种二维数组,如果需要,甚至是三维数组(我不完全理解您要做什么)。由于我们需要更改您的大部分代码,您应该创建电子表格的副本,删除所有敏感信息,并在此处共享可编辑的副本以供我们查看!

标签: javascript arrays google-apps-script


【解决方案1】:

对我来说,您似乎拥有三个包含 N 个条目的“列”数组,并希望将它们写入 N 行 3 列的范围(命名为 copy_range)。最好的方法是将这 3 个数组加入必要的 2D 数组中,可以在一次调用中直接写入:

const output = name.map(function (nameVal, row) {
  return [nameVal, id[row], availability[row]];
});
copy_range.setValues(output);

上面使用Array#map方法迭代name数组,并将每个元素nameVal关联的索引赋值为row。然后使用row 访问idavailability 数组中的相应元素。

【讨论】:

  • 我认为您已经找到了答案,很抱歉没有对原始问题进行更多描述。基本上我有三个 1D 数组,即 name、id、available,每个数组都有 N 个元素。因此,我声明了一个范围 N*3 来容纳包含上述 3 个 1D 数组的所有值的 2D 数组。一旦我这样做了,我就使用 setValues 一次性完成此操作。我这样做的方式是使用两个 for 循环,一个用于行,另一个用于列,我将探讨您的答案,因为我还不知道 map。谢谢你的回答。
猜你喜欢
  • 2015-11-14
  • 2020-10-14
  • 2017-03-05
  • 2013-03-29
  • 2017-05-07
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多