初始化数组长度和分配给索引与重复推送之间的区别

时间:2019-03-20 12:36:04

标签: javascript arrays google-apps-script google-sheets

在构建工作表名称列表时,我遇到了这个问题: List names of sheets in Google Sheets and skip the first two

为您节省点击次数,此人的解决方案是:(向下剥离,伪代码)

getSheets() // Get all the sheets in spreadsheet workbook
  var out = new Array( sheets.length+1 ) ;

  for (var i = 1 ; i < sheets.length+1 ; i++ )
    out[i] = [sheets[i-1].getName()];
  return out

我的解决方案将利用:

...
var sheetName = sheet[i].getName();
out.push(sheetName);

第一个解决方案似乎是动态创建空数组值,然后再声明它们的值。虽然我一直只是将新值推入数组。

有什么区别?

在哪种情况下比另一种更好?

在哪种情况下应避免?

1 个答案:

答案 0 :(得分:0)

您的代码和原始代码做的事情完全不同。

假设sheets中包含从"sheet1"返回名称"sheet2""sheet3"getName的对象,原始代码将创建一个看起来像像这样:

[
    (missing),
    ["sheet1"],
    ["sheet2"],
    ["sheet3"]
]

请注意两件事:

  1. 索引0处没有任何条目。(从根本上说,它根本不存在,这与现有的并且包含值undefined略有不同。)
  2. 其他条目是单元素数组,每个条目都包含其工作表名称。

您的代码改为创建此代码:

[
    "sheet1",
    "sheet2",
    "sheet3"
]

想必作者有一个跳过索引0并创建从属数组的原因(我想是因为他们将结果数组传递给某些期望采用这种形式的API函数)。

因此,这里并没有真正的“更好”或“更差”,只是有所不同。

如果您的基本问题是:

var original = ["one", "two", "three"];
var updated = [];
for (var i = 0; i < original.length; ++i) {
    updated[i] = original[i].toUpperCase(); // Or whatever
}

比这更好/更糟糕:

var original = ["one", "two", "three"];
var updated = [];
for (var i = 0; i < original.length; ++i) {
    updated.push(original[i].toUpperCase()); // Or whatever
}

答案是:这实际上是风格问题。两者之间的性能没有明显差异(并且很少有关系),有趣的是,一种方法在某些JavaScript引擎上更快,而另一种在其他JavaScript引擎上更快。

使用map可以更好地表达这两种情况:

var original = ["one", "two", "three"];
var updated = original.map(function(entry) { return entry.toUpperCase(); });

我认为Google表格具有map,尽管它大多数情况下仅具有ES3级功能。


旁注:new Array几乎永远不是创建数组的正确方法。