javascript - 以不同的速率循环遍历数组

标签 javascript arrays for-loop google-apps-script

filesNamed 是我想要用来累积和设置数据的引用数组。因此,对于 filesNamed 中的每个索引,包含相同电影标题的 emailData 数组应该被累积并最终设置在 Google 电子表格中的某个范围内。除了将数据设置在一定范围内之外,我在这项任务的第一部分中遇到了问题。

var filesNamed = [
                  ["Happiness","Karate for Life","Dogtooth","The Streetfighter","Mind Game","The Raid","The Hole","Plaga Zombie","Funny Games"]
                ];

var emailData = [
                      ["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
                      ["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
                      ["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
                      ["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
                      ["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
                      ["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
                      ["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
                      ["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
                      ["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
                      ["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
                      ["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
                      ["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
                      ["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
                      ["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
                      ["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
                      ["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
                      ["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
                      ["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
                      ["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
                      ["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
                      ["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
                      ["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
                      ["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
                      ["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
                      ["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
                      ["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
                      ["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
                      ["Date","Funny Games","Sender 45","Receiver 45","Subject 45" ],
                      ["Date","Funny Games","Sender 45","Receiver 45","Subject 45" ]
                   ];

下面代码的问题是,虽然第一次循环 filesNamed[0][0] == emailData[0][1] 返回匹配项,但第二次循环时,两个 for 循环都递增 - 但我们还没有完成从 emailData 累积上面标题为 Happiness 的所有数组(还有 4 个)。我认为计数器应该只在循环中断后增加,这表明我们已经到达了属于移动幸福的最后一个数组。我尝试将计数器(l++)放在 else 语句中,但这不起作用。

正如我所言:我希望属于特定电影标题的数组中的所有数据都放入其自己的电子表格中。每个子数组(从日期开始)应该占据自己的行,其中索引将跨越 5 列。

function theo (){

  Logger.log("emailData.length: " + emailData.length);
  Logger.log("filesNamed[0].length: " + filesNamed[0].length);
  for(var i=0;i<emailData.length;i++){
    for(var l=0;l<filesNamed[0].length;l++){
      if(filesNamed[0][l] == emailData[i][1]){
        Logger.log("");
        Logger.log("match");
        Logger.log("emailData[0]): " + emailData[i][1]);
        Logger.log("filesNamed[0][l]: " + filesNamed[0][l]);
        Logger.log("");
        Logger.log("l: "+l);
        Logger.log("i: "+i);
      } else {
        Logger.log("");
        Logger.log("broke");
        Logger.log("emailData[0]): " + emailData[i][1]);
        Logger.log("filesNamed[0][l]: " + filesNamed[0][l]);
        Logger.log("");
        Logger.log("l: "+l);
        Logger.log("i: "+i);
      }
    }
  }
}

幸福电子表格将包含 5 行。 Karate for Life 电子表格将包含 6 行。 Dogtooth 电子表格将包含 4 行。等等...

一位 friend 建议我学习迭代器,我会的,但我想知道是否有另一种方法来构造我的双循环,以使其更接近原始方法的工作。从这次失败中还可以吸取一些教训。

最佳答案

我认为您正在寻找的最简单的积累可以是这样的。

function theo2() {
  var accumulatedFiles = filesNamed[0].map(
    function (title) {
      var emails = this;
      return {
        title: title,
        emails: emails.filter(
          function (email) {
            var title = this;
            return email[1] == title;
          },
          title
        )
      };
    },
    emailData
  );
}

这会生成一个对象数组,其中第一个索引是 filesNamed 中的电影标题索引,标题属性、标题和电子邮件属性是该索引中的数组数组与标题。

副产品是它只返回标题与原始源列表匹配的电子邮件。如果您想让电子邮件响应来确定标题累积,并且根本没有 filesNamed 数组,您可以更加紧凑。

Snapshot of the debugger of the returned object

这将是您可以用来填充工作表或执行任何您想要执行的操作的开始。

正如 Sandy 指出的,上面的函数放弃了循环的使用,而是使用 .map().filter()。循环也可以工作,但我个人更喜欢语义描述和方法的简洁性。

为了完整起见,循环形式可能是这样的(猜猜看,这或多或少是你已经拥有的):

function theo3() {
  var accumulatedFiles = [],
      filmEmails = [];

  for (var i = 0; i < filesNamed[0].length; i += 1) {    
    filmEmails = [];
    for (var j = 0; j < emailData.length; j += 1) {
      if (emailData[j][1] == filesNamed[0][i]) {
        filmEmails.push(emailData[j]);
      }
    }
    accumulatedFiles.push({title: filesNamed[0][i], emails: filmEmails});
  }
}

关于javascript - 以不同的速率循环遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715376/

相关文章:

javascript - 使用 TraceKit javascript 库完成堆栈跟踪

javascript - Fabric.js 裁剪 Sprite 与单个图像的效率

javascript - 用于从字符串创建数组的正则表达式

javascript - 我正在尝试使用 JSON 存储音乐专辑

c - 将十进制的二进制存储在 char 数组中

c - C 中的类型转换不起作用(尝试将数字转换为 ASCII 表示的字母)

javascript - JavaScript 中的密码字符检查器

javascript - 来自 javascript 的 PHP 文件

C - 在 vector 中输入数字 0 时中断 while 循环

javascript - 任何分辨率下的 Twitter Bootstrap 折叠菜单