[英]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.