繁体   English   中英

在 JavaScript 中使用嵌套循环迭代大型 2D 数组

[英]Iterate over a large 2D array with nested loop in JavaScript

我试图迭代一个超过 3000 行和 54 列的大型二维数组。 每个索引包含一个字符串或整数值。 当我尝试使用嵌套的 for 循环时,我无法测试它,因为它需要很长时间才能完成。 我怎样才能解决这个问题?

我从之前的一篇文章中得到了这个代码,它做了类似的事情:

function getOrder() {
  const srcSheetName = "result";
  const dstSheetName = "Order Changes";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 1. Retrieve source values.
  const srcSheet = ss.getSheetByName(srcSheetName);
  const [[,,,,,,,, ...header], ...srcValues] = srcSheet.getRange("F1:BQ" + srcSheet.getLastRow()).getValues();

  // 2. Create an object using the source values.
  const srcObj = srcValues.reduce((o, [a,,,,,,,, ...v]) => {
    const temp = v.reduce((s, r, i) => {
      if (r.toString() != "") s += `${header[i]} (${r}) `;
      return s;
    }, "");
    return Object.assign(o, {[a]: temp || ""});
  }, {});

  
  // 3. Retrieve the header column of destination values.
  const dstSheet = ss.getSheetByName(dstSheetName);
  const dstRange = dstSheet.getRange(3, 1, dstSheet.getLastRow() - 1);
  const dstValues = dstRange.getValues();
  
  // 4. Create the output values using the header column and the object.
  const putValues = dstValues.map(([a]) => [srcObj[a] || ""]);

  console.log(srcObj)

  // 5. Put the values.
  dstRange.offset(0, 2).setValues(putValues);
}

上面的代码匹配两个不同工作表上的名称,如果找到匹配项,则返回每列的值和标题,并且在使用相同数量的条目时非常快速地执行此操作。 我认为它是如此之快,因为 .reduce 删除二维数组中不必要的信息。

我怎样才能达到类似的速度? 我想在 2d 数组中搜索最后 12 列中一行的非零条目。 如果任何列包含一个值,我想返回该行的索引 0 并继续直到数组完全循环。

我试图调整上面的代码,但我并不完全理解它,也无法按照我想要的方式操作它。 这是我写的:

function getCustomer(){
  const srcSheetName = "result";
  const dstSheetName = "Allergy";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const allergyRange = srcSheet.getRange('F1:BQ' + srcSheet.getLastRow()).getValues();
  const dstSheet = ss.getSheetByName(dstSheetName);
  Logger.log(allergyRange);
  for (let i = 0; i < allergyRange.length; i++){
    for (let k = 0; k < allergyRange[i].length; k++){
         Logger.log("hi");
    }
  }
  
}

我想在我编写的代码中嵌套一个 if 语句,但不知道有一种方法可以引用 2d 数组的一行中的一系列索引,此时我认为这需要太多时间才能实用. 任何提示将非常感谢。

假设allergyRange的格式为[row, ...] ,其中每一行都是一个数组,其每个索引都指向一列:

allergyRange.map(row => row.slice(row.length-12)).forEach((row, i) => {
    if(!row.every(val => val == 0)) console.log(allergyRange[i][0])
});

这将映射一个仅包含最后 12 列的新数组数组,检查该行中的每个值是否都等于 0,如果不是,则记录该行的第 0 个索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM