提高在循环中向数组添加列的效率?
Improving efficiency of adding a column to an array in a loop?
所以我写了一些代码,根据“字典”转到一本书的 ID,并从第二个 sheet 之后的那本书中的所有 sheet 中获取数据。然后将该数据聚合到一个数组中。我的问题围绕着改进 if 语句中的 for 循环的想法。那就是将“供应商名称”添加到代表 sheet/data 中的一行的子数组的前面。有人告诉我这是低效的,因为代码必须遍历每个子数组并添加一个值。
有没有更有效的方法?我这样做是因为我正在复制存储为数组数组的范围的值。所以要添加数据,我必须重新访问子数组。是否可以在复制值的同时添加新数据(供应商名称)?这样会更有效率吗?推荐使用箭头函数,但是我不熟悉它们的用法
function aggregate() {
var combinedData = []
var idArray = {
"suppliername":"id",
};
for (var supplierName in idArray){
var sBook = SpreadsheetApp.openById(idArray[supplierName]);
var sheets = sBook.getSheets();
for (var index = 2; index <sheets.length; index++){
var sheet = sheets[index];
var dataLength = sheet.getRange("E5:E").getValues().filter(String).length;
if(dataLength != 0){
var dataRange = sheet.getRange(5,2,dataLength,14);
var dataValues = dataRange.getValues();
for (row in dataValues) {
dataValues[row].unshift(supplierName);
};
combinedData = combinedData.concat(dataValues);
};
};
};
var dataLength = combinedData.length;
const dSheet = SpreadsheetApp.openById("id").getSheets()[0];
dSheet.getRange(2,1,dSheet.getMaxRows(),dSheet.getMaxColumns()).clearContent();
var dRange = dSheet.getRange(2,1,dataLength,15);
dRange.setValues(combinedData);
};
在你的脚本中,做如下修改怎么样?
发件人:
for (row in dataValues) {
dataValues[row].unshift(supplierName);
};
combinedData = combinedData.concat(dataValues);
收件人:
combinedData = combinedData.concat(dataValues.map(e => [supplierName].concat(e)));
或
combinedData = [...combinedData, ...dataValues.map(e => [supplierName, ...e])];
参考文献:
所以我写了一些代码,根据“字典”转到一本书的 ID,并从第二个 sheet 之后的那本书中的所有 sheet 中获取数据。然后将该数据聚合到一个数组中。我的问题围绕着改进 if 语句中的 for 循环的想法。那就是将“供应商名称”添加到代表 sheet/data 中的一行的子数组的前面。有人告诉我这是低效的,因为代码必须遍历每个子数组并添加一个值。
有没有更有效的方法?我这样做是因为我正在复制存储为数组数组的范围的值。所以要添加数据,我必须重新访问子数组。是否可以在复制值的同时添加新数据(供应商名称)?这样会更有效率吗?推荐使用箭头函数,但是我不熟悉它们的用法
function aggregate() {
var combinedData = []
var idArray = {
"suppliername":"id",
};
for (var supplierName in idArray){
var sBook = SpreadsheetApp.openById(idArray[supplierName]);
var sheets = sBook.getSheets();
for (var index = 2; index <sheets.length; index++){
var sheet = sheets[index];
var dataLength = sheet.getRange("E5:E").getValues().filter(String).length;
if(dataLength != 0){
var dataRange = sheet.getRange(5,2,dataLength,14);
var dataValues = dataRange.getValues();
for (row in dataValues) {
dataValues[row].unshift(supplierName);
};
combinedData = combinedData.concat(dataValues);
};
};
};
var dataLength = combinedData.length;
const dSheet = SpreadsheetApp.openById("id").getSheets()[0];
dSheet.getRange(2,1,dSheet.getMaxRows(),dSheet.getMaxColumns()).clearContent();
var dRange = dSheet.getRange(2,1,dataLength,15);
dRange.setValues(combinedData);
};
在你的脚本中,做如下修改怎么样?
发件人:
for (row in dataValues) {
dataValues[row].unshift(supplierName);
};
combinedData = combinedData.concat(dataValues);
收件人:
combinedData = combinedData.concat(dataValues.map(e => [supplierName].concat(e)));
或
combinedData = [...combinedData, ...dataValues.map(e => [supplierName, ...e])];