为何无法一次性将变量声明为二维数组并直接使用?
为什么移除
cVar[p] = [];后代码无法运行? 我需要从表格中提取包含字段名的第一列,以及另一列随函数输入变化的数值,将结果存储为二维数组。下面这段代码可以正常运行:
var person = 'jack' var parameters = SpreadsheetApp.openById(SPREADSHEET_ID__CONFIGURATION).getSheetByName('Parameters').getDataRange().getValues(); var cVar = []; for (var p = 0; p < parameters.length; p++){ cVar[p] = []; cVar[p][0] = parameters[p][0]; cVar[p][1] = parameters[p][parameters[0].indexOf(person)]; }
但我觉得cVar[p] = [];这行是多余的,改成下面的写法后却无法正常运行,这是为什么?
var person = 'jack' var parameters = SpreadsheetApp.openById(SPREADSHEET_ID__CONFIGURATION).getSheetByName('Parameters').getDataRange().getValues(); var cVar = [[]]; for (var p = 0; p < parameters.length; p++){ cVar[p][0] = parameters[p][0]; cVar[p][1] = parameters[p][parameters[0].indexOf(person)]; }
问题根源
核心是两种数组初始化方式的差异,以及JavaScript数组的索引访问规则:
- 第一种初始化
var cVar = []:创建了一个空数组,长度为0。循环中cVar[p] = []的作用是给数组的第p个位置显式创建一个子数组,之后才能安全地给这个子数组的[0]和[1]索引赋值。 - 第二种初始化
var cVar = [[]]:创建了一个仅包含1个空数组的数组,长度为1。
当循环执行到p=1时,cVar[1]是undefined(因为初始化的数组只有索引0的元素),此时直接给cVar[1][0]赋值,相当于尝试给一个不存在的对象设置属性,会抛出Cannot set properties of undefined (setting '0')的错误,导致代码崩溃。
更简洁的优化写法
不用手动初始化子数组,直接用push方法添加新的子数组,代码更简洁且不易出错:
var person = 'jack' var parameters = SpreadsheetApp.openById(SPREADSHEET_ID__CONFIGURATION).getSheetByName('Parameters').getDataRange().getValues(); var cVar = []; // 提前计算目标列索引,避免循环内重复计算提升性能 var targetColIndex = parameters[0].indexOf(person); for (var p = 0; p < parameters.length; p++){ cVar.push([ parameters[p][0], parameters[p][targetColIndex] ]); }
内容的提问来源于stack exchange,提问作者Zjost
相关产品推荐
相关产品推荐

