Google Apps Script动态创建肉类分类数组报错求助
问题描述
目标
动态创建并填充仅包含特定肉类类型的独立数组:
console.log(beef_meat_array)应返回:['Rump Fillet','Rump Steak', 'Ground Chuck']console.log(lamb_meat_array)应返回:['Cutlets']console.log(chicken_meat_array)应返回:['Drumsticks', 'Breasts']console.log(fish_meat_array)应返回:['Red snapper', 'Salmon', 'Tilapia']
运行代码
var types_of_meat = [ ['Beef', 'Rump Fillet'], ['Beef', 'Rump Steak'], ['Beef', 'Ground Chuck'], ['Lamb', 'Cutlets'], ['Chicken', 'Drumsticks'], ['Chicken', 'Breasts'], ['Fish', 'Red snapper'], ['Fish', 'Salmon'], ['Fish', 'Tilapia'] ]; // 该函数用于创建指定“列”的数组 const arrayColumn = (arr, n) => arr.map(x => x[n]); // 该函数用于筛选数组中的唯一值 function onlyUnique(value, index, array) { return array.indexOf(value) === index; } // 以下数组仅包含types_of_meat数组第一列的肉类类型 var meat_type_array = arrayColumn(types_of_meat, 0); // 以下数组仅包含肉类类型的唯一值 var unique_meat_types = meat_type_array.filter(onlyUnique); for (i = 0; i <= types_of_meat.length - 1; i++) { eval("var " + unique_meat_types[i] + "_meat_array = " + types_of_meat.filter(e => e[0] == unique_meat_types[i])); }
实际运行结果
SyntaxError: Unexpected identifier 'Fillet'
需求背景
静态定义的数组无法自动适配新增内容,比如主数组添加猪肉类型时,手动创建对应独立数组太麻烦,所以需要动态实现。
解决方案
报错原因
原代码用eval时,types_of_meat.filter(...)返回的二维数组转成字符串后,会变成[["Beef","Rump Fillet"],...],eval执行时会把这串内容当成代码,其中Rump Fillet的空格会被识别成标识符分隔,直接触发语法错误。
方法1:用对象存储分类数组(推荐)
避免eval的安全风险和语法问题,用对象统一管理分类后的数组,自动适配新增肉类类型:
var types_of_meat = [ ['Beef', 'Rump Fillet'], ['Beef', 'Rump Steak'], ['Beef', 'Ground Chuck'], ['Lamb', 'Cutlets'], ['Chicken', 'Drumsticks'], ['Chicken', 'Breasts'], ['Fish', 'Red snapper'], ['Fish', 'Salmon'], ['Fish', 'Tilapia'] ]; // 创建分类存储对象 const meatGroups = {}; // 遍历原数组完成分类 types_of_meat.forEach(([type, cut]) => { // 生成目标变量名(转小写) const key = `${type.toLowerCase()}_meat_array`; // 初始化空数组(如果不存在) if (!meatGroups[key]) { meatGroups[key] = []; } // 添加对应肉类部位 meatGroups[key].push(cut); }); // 使用示例 console.log(meatGroups.beef_meat_array); // ['Rump Fillet','Rump Steak', 'Ground Chuck'] console.log(meatGroups.lamb_meat_array); // ['Cutlets'] console.log(meatGroups.chicken_meat_array); // ['Drumsticks', 'Breasts'] console.log(meatGroups.fish_meat_array); // ['Red snapper', 'Salmon', 'Tilapia']
方法2:动态创建全局变量(不推荐,易污染全局环境)
如果一定要生成独立的全局变量,可通过window对象(浏览器环境)实现,避开eval的问题:
var types_of_meat = [ ['Beef', 'Rump Fillet'], ['Beef', 'Rump Steak'], ['Beef', 'Ground Chuck'], ['Lamb', 'Cutlets'], ['Chicken', 'Drumsticks'], ['Chicken', 'Breasts'], ['Fish', 'Red snapper'], ['Fish', 'Salmon'], ['Fish', 'Tilapia'] ]; // 获取唯一肉类类型 const uniqueMeatTypes = [...new Set(types_of_meat.map(item => item[0]))]; // 为每种肉类创建全局数组 uniqueMeatTypes.forEach(type => { const varName = `${type.toLowerCase()}_meat_array`; // 筛选对应类型并提取部位列 window[varName] = types_of_meat.filter(item => item[0] === type).map(item => item[1]); }); // 使用示例 console.log(beef_meat_array); // ['Rump Fillet','Rump Steak', 'Ground Chuck'] console.log(lamb_meat_array); // ['Cutlets']
内容的提问来源于stack exchange,提问作者Southern-Remove
相关产品推荐
相关产品推荐

