Google Script中push方法操作二维数组出现异常覆盖问题
异常产生原因
这个问题和Google Apps Script本身无关,是JavaScript的基础类型特性导致的:数组是引用类型,变量赋值时不会复制数组内容,只会传递指向同一块内存地址的引用。你的代码全程只操作了初始化时创建的那一个空数组,从来没有生成过新的独立子数组。
逐轮拆解循环执行过程就能看得很清楚:
- 初始化阶段
andrea = [[]],数组内只有1个元素,是索引为0的空数组,下文统一称这个数组为originArr。 - 第一轮循环(counter=0):
ft = andrea[counter]等价于让ft指向originArr,没有创建新数组- 执行push后
originArr变为['el1'] andrea.push(ft)是把originArr的引用又存到了andrea的索引1位置,此时andrea的0、1号元素指向同一个数组
- 第二轮循环(counter=1):
ft = andrea[1]拿到的还是originArr的引用- 执行push后
originArr变为['el1', 'el2'] - push到andrea的索引2位置的还是
originArr的引用,此时andrea前3个元素全指向同一个数组
- 第三轮循环(counter=2):
ft = andrea[2]依旧指向originArr- 执行push后
originArr变为['el1', 'el2', 'el3'] - push到andrea索引3位置的还是
originArr的引用
最终打印andrea时,4个元素全指向同一个已经被修改为['el1','el2','el3']的数组,自然所有子数组内容完全一致。
修正方法
每次循环时先对前一个子数组做浅拷贝,生成独立的新数组后再push新元素,就可以得到预期的递增结构。修正后代码如下:
function check_push() { var andrea = [[]]; ss = SpreadsheetApp.getActiveSpreadsheet(); entra = ss.getRange('A1:A'); for (var counter = 0; counter <= 2; counter = counter + 1) { // 通过展开运算符创建上一个子数组的浅拷贝,生成独立新数组 ft = [...andrea[counter]] ft.push(entra.getCell(counter+1,1).getValue()) andrea.push(ft); } Logger.log(andrea); }
执行后输出结果为[ [], ['el1'], ['el1', 'el2'], ['el1', 'el2', 'el3'] ],和预期完全一致。
内容的提问来源于stack exchange,提问作者Andrea Marino
相关产品推荐
相关产品推荐

