我如何直接赋值给数组,但在OOB异常上使用push方法

How do I directly assign values to an array but use push method on OOB exception?

本文关键字:异常 方法 push OOB 但在 何直接 赋值 数组      更新时间:2023-09-26

我的理解是,从性能的角度来看,在填充数组时,直接赋值比.push()更可取。

我的代码目前如下:

for each (var e in Collection) {
  do {
    DB_Query().forEach(function(e){data.push([e.title,e.id])});
  } while (pageToken);
}

DB_Query()方法运行Google Drive查询并返回一个列表。

我的问题出现,因为DB_Query()可以返回一个可变长度的列表。因此,如果我构造data = new Array(100),直接赋值就有可能越界。

是否有一种方法,我可以trycatch一个越界异常有值直接分配给100个预分配的索引,但使用.push()任何溢出?这里的期望是OOB异常不会经常发生。

另外,我不确定它是否重要,但我正在使用以下方法清除计数器变量>=100后的数组:

while(data.length > 0) {data.pop()}

在Javascript中,如果你设置的索引值大于数组长度,它会自动"拉伸"数组。所以没必要为这个操心。如果你能猜出数组的大小,那就去猜吧。

关于你的清算循环:这是正确的,似乎pop确实是最快的方式。我最初的建议是将数组length设置回零:data.length = 0;

现在有一个提示,我认为这真的会对性能产生影响:你担心的是错误的部分!

在Apps Script中,需要长时间的不是动态调整数组大小,或者处理数据,这是快速的。问题总是与"API调用"有关。即使用UrlFetchSpreadsheet.Range.getValue等。

你应该注意使尽可能少的API调用,在你的情况下(我猜现在,因为我没有看到你的整个代码),你似乎做错了。如果DB_Query是昂贵的(在API调用方面),你不应该把它嵌套在两个循环下。最好的解决方案通常包括事先弄清楚您需要的所有内容(如果它不调用任何地方,则执行尽可能多的循环),然后传递所有参数以执行批量操作并一次收集所有数据(在一个API调用中),即使它涉及获取比您需要的更多的数据。然后,在手中的整个数据,循环并根据需要转换它(这是快速部分)。