如何向sanitize函数动态传递对象数组索引键以避免Undefined错误
解决对象数组动态取值防undefined错误的问题
首先看你的对象数组结构:
const obj = [ {Id: 15872, Email: 'abc@hotmail.com'}, {Id: 15873, Email: 'def@hotmail.com'}, {Id: 16873, Email: 'ghi@hotmail.com'} ];
你想在循环中安全取值避免undefined报错,但之前的写法有问题——拼接的"{$i}Email"会被当成对象的单个属性名(比如"0Email"),而非obj[i].Email的层级路径,所以取不到正确值。下面给你两种可行方案:
方案1:直接传递数组索引和属性名
修改sanitize函数,让它分别接收数组、索引和属性名,分步检查有效性:
let Email; // 用let声明i,避免全局变量污染 for (let i = 0; i < obj.length; i++) { Email = sanitize(obj, i, "Email"); // 此处可处理Email值,比如打印或存入变量 console.log(Email); } function sanitize(objArray, index, key, defaultValue = "---"){ // 先确认数组对应位置的对象存在,再检查属性值 if (objArray[index] !== undefined && objArray[index][key] !== undefined) { return objArray[index][key]; } return defaultValue; }
这个方案逻辑直白,适配你的场景:任意一步不满足条件就返回默认值,彻底避免undefined报错。
方案2:支持通用嵌套路径的sanitize函数
如果之后需要处理更深的嵌套属性(比如obj[i].User.Info.Email),可以让函数接收路径数组,逐层遍历检查:
let Email; for (let i = 0; i < obj.length; i++) { // 用数组传递层级路径:先取索引i,再取Email属性 Email = sanitize(obj, [i, "Email"]); console.log(Email); } function sanitize(target, pathSegments, defaultValue = "---"){ let current = target; for (const segment of pathSegments) { // 中间任意一步为空值,直接返回默认值 if (current == null) { return defaultValue; } current = current[segment]; } // 遍历完路径后检查最终值是否存在 return current !== undefined ? current : defaultValue; }
这个方案扩展性更强,不管是数组索引还是多层对象属性,都能通过路径数组统一处理。
注意事项
- 循环必须用
let i(或const i配合for...of),避免i成为全局变量引发意外问题; - 检查属性时优先用
!== undefined,避免隐式类型转换的坑; - 判断空值(null/undefined)可直接用
current == null,这是JS里简洁且安全的写法。
内容的提问来源于stack exchange,提问作者gil.code
相关产品推荐
相关产品推荐

