You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:05:30