
本文讲解如何处理从 Google Sheets 等外部源读取的、被错误解析为字符串而非数组的嵌套数据,通过类型校验、JSON 安全解析与解构赋值,可靠提取 city 等字段,避免 Cannot read properties of undefined 错误。
本文讲解如何处理从 google sheets 等外部源读取的、被错误解析为字符串而非数组的嵌套数据,通过类型校验、json 安全解析与解构赋值,可靠提取 `city` 等字段,避免 `cannot read properties of undefined` 错误。
在实际开发中(尤其是对接 Google Sheets API 时),常遇到一种典型问题:本应是 [[{city: 'ny'}], [{city: 'tx'}]] 的嵌套数组结构,却被读作字符串数组,例如:
const array = [
"[{'city': 'new york', 'state': 'ny'}]",
"[{'city': 'dallas', 'state': 'tx'}]",
"",
"[{'city': 'los angeles', 'state': 'ca'}]"
];
此时直接执行 item[0].city 会报错 —— 因为 item 是字符串,item[0] 取的是首字符 '[',而非子数组;而空字符串 "" 更会导致 undefined 访问。
✅ 正确处理步骤
1. 过滤无效项并安全解析字符串
先剔除空项和空白字符串,再对每个字符串尝试 JSON 解析。注意原始字符串使用单引号,需替换为双引号以符合 JSON 标准:
const cities = array
.filter(item => typeof item === 'string' && item.trim() !== '')
.map(str => {
try {
// 替换单引号为双引号,并包裹成合法 JSON 数组格式
const jsonStr = str.replace(/'/g, '"');
const parsed = JSON.parse(jsonStr); // → [{city: "...", state: "..."}]
return Array.isArray(parsed) && parsed.length > 0 ? parsed[0] : null;
} catch (e) {
console.warn('Failed to parse:', str, e);
return null;
}
})
.filter(obj => obj && typeof obj === 'object' && 'city' in obj)
.map(({ city }) => city);
console.log(cities); // ['new york', 'dallas', 'los angeles']
2. 若原始数据本应是 JS 数组(非字符串),请优先修复源头
如确认数据本应为合法嵌套数组(如 [[{city: 'ny'}], ...]),但因 Google Apps Script 的 getValues() 默认返回二维字符串数组导致结构失真,请改用显式解析:
// ✅ 推荐:在 Apps Script 端预处理(更健壮)
// const values = sheet.getRange('A1:A10').getValues();
// const parsed = values.map(row => row[0] ? JSON.parse(row[0]) : null);
3. 增强版工具函数(含容错与日志)
function extractCitiesFromStringArray(strArray) {
if (!Array.isArray(strArray)) return [];
return strArray
.map((item, i) => {
if (typeof item !== 'string' || !item.trim()) return null;
try {
const clean = item.trim().replace(/^"(.*)"$/g, '$1').replace(/'/g, '"');
const arr = JSON.parse(clean);
return Array.isArray(arr) && arr[0] ? arr[0] : null;
} catch (e) {
console.error(`Parse error at index ${i}:`, item, e.message);
return null;
}
})
.filter(Boolean)
.map(obj => obj.city || null)
.filter(Boolean);
}
⚠️ 注意事项
-
永远不要使用
eval()或Function()解析不可信字符串——存在严重 XSS 和执行风险; - 单引号 JSON 非标准,必须替换为双引号后才可
JSON.parse(); - 空项、
null、undefined、非数组字符串均需显式过滤,避免运行时错误; - 在 Google Sheets 场景中,建议在服务端(Apps Script)完成结构化解析,前端只接收干净数据。
通过以上方法,你不仅能解决 TypeError: Cannot read properties of undefined,更能建立健壮的数据清洗流程,适配各类外部数据源的不规范输出。










