将预定义数组推送到更大数组的最有效方法是什么



场景:

  • 我有一个2D数组,它表示电子表格对象中单元格的背景颜色:
[
["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"],
["", "", "", "", "", ""],
["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"],
["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"],
["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"],
["", "", "", "", "", ""],
// etc
] 
  • 行的颜色取决于一些if条件,并且只能是全部#FFFF00或全部""
  • 每个单元格的颜色必须单独定义,但实际情况是,每行的列数总是相同的,并且一行的颜色是一致的

问题:将每行颜色推送到主数组的最有效方法是什么?要么像这样在循环外创建数组:

const yellowArr = ["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"]
const emptyArr = ["", "", "", "", "", ""]
const masterArr = []
rows.forEach(function(row) [
if (condition) {
masterArr.push(yellowArr)
}
else {
masterArr.push(emptyArr)
}
])

或者简单地在循环中这样推动它们:

const masterArr = []
rows.forEach(function(row) [
if (condition) {
masterArr.push(["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"])
}
else {
masterArr.push(["", "", "", "", "", ""])
}
])

这是一段较大代码的一部分,行数可能在10到数千行之间,因此优化非常重要,因为脚本的运行时间有限。

请随时重新路由到更适合的堆栈交换站点,我找不到一个专门用于代码效率的站点。

如果您将一个数组推送给其他数组,在您的情况下为masterArr,则被推送的数组的引用将被推送给masterArr。

记住这一点,让我们看看为什么您的第二个选项有一些代码有问题。

masterArr.push(["#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00", "#FFFF00"])
masterArr.push(["", "", "", "", "", ""])

这些数组没有分配给任何变量。尽管如此,它们还是会消耗堆中的一些内存。因此,在rows的每次迭代中,都会创建新的数组,并为重复的数组使用内存。这不是很有内存效率。

因此,您的第一个选择是提高内存效率。因为相同的内存引用将被推送到masterArr数组。

但请记住,如果您在yellowArremptyArr这些数组中进行更改,则相同的更改将反映在masterArr中。

您不必在循环之外创建yellowArremptyArr数组。我们可以通过条件来检查,不是吗?

我将只使用一个循环来迭代行和单元格,然后将颜色直接推送到主数组中。

const masterArr = [];
for (let i = 0; i < rows.length; i++) {
masterArr.push([]);
const color = condition ? "#FFFF00" : "";
for (let j = 0; j < rows[i].length; j++) {
masterArr[i].push(color);
}
}

最新更新