如何在for...in循环中获取对象属性名并校验其合法性?
嘿,咱们先拆解你遇到的问题,再一步步搞定你的需求~
问题分析与解决方案
首先你说的没错,原代码里的.name伪属性是核心错误——在for...in循环中,prop本身就是属性名的字符串(比如"id"、"name"),它不是对象,自然没有.name这个属性。另外原代码的条件判断逻辑也存在偏差,比如prop.name === id这种写法,类型和值完全不匹配,根本无法触发预期的判断。
用for...in实现需求完全可行!
只要修正对prop的理解和判断逻辑就行。for...in遍历的是对象的可枚举属性名(字符串类型),我们可以直接拿到属性名做合法性检查,同时通过dog[prop]获取对应属性值做进一步校验。
给你写个正确的示例,假设合法属性名是id、name、breed:
const dog = { id: 1, name: "Henry", breed: "border-collie" }; // 定义合法属性名的白名单 const validPropNames = ["id", "name", "breed"]; for (let prop in dog) { // 第一步:检查属性名是否合法 if (!validPropNames.includes(prop)) { console.warn(`非法属性名:${prop}`); break; } // 第二步:根据不同属性名做对应的值校验 switch (prop) { case "id": if (typeof dog[prop] === "number") { console.log("id 属性合法!"); } else { console.warn("id 必须是数字类型!"); break; } break; case "name": if (dog[prop] === "Henry") { console.log("name 属性值符合要求!"); } else { console.warn("name 必须为 Henry!"); break; } break; case "breed": if (dog[prop] === "border-collie") { console.log("breed 属性值完美!"); } else { console.warn("breed 必须为 border-collie!"); break; } break; } }
这样既完成了属性遍历,又实现了属性名+属性值的双重校验,逻辑清晰多了~
其他遍历属性并检查属性名的方法
如果你不想用for...in,还有这些更灵活的方案:
1. Object.keys() 获取属性名数组
这个方法会返回对象自身可枚举属性名的数组,搭配forEach或for...of遍历都很方便:
const dog = { id: 1, name: "Henry", breed: "border-collie" }; const validPropNames = ["id", "name", "breed"]; Object.keys(dog).forEach(prop => { if (!validPropNames.includes(prop)) { console.warn(`非法属性名:${prop}`); return; } // 后续校验逻辑和上面一致,这里就不重复写啦 });
2. Object.entries() 同时获取属性名和值
这个方法直接返回[属性名, 属性值]的二维数组,不用再写dog[prop]来取值,更简洁:
const dog = { id: 1, name: "Henry", breed: "border-collie" }; const validPropNames = ["id", "name", "breed"]; for (const [prop, value] of Object.entries(dog)) { if (!validPropNames.includes(prop)) { console.warn(`非法属性名:${prop}`); break; } switch (prop) { case "id": typeof value === "number" ? console.log("id 合法") : console.warn("id 类型错误"); break; case "name": value === "Henry" ? console.log("name 符合要求") : console.warn("name 错误"); break; case "breed": value === "border-collie" ? console.log("breed 完美") : console.warn("breed 错误"); break; } }
3. Object.getOwnPropertyNames() 包含不可枚举属性
如果你的对象存在不可枚举属性需要检查,就用这个方法——它会返回对象自身的所有属性名(不管是否可枚举),用法和Object.keys()完全一致。
总结一下:for...in完全能满足你的需求,只要修正原代码对prop的错误理解;如果想要更简洁的遍历体验,Object.keys()和Object.entries()都是不错的替代方案。
内容的提问来源于stack exchange,提问作者Leviathan_the_Great
相关产品推荐
相关产品推荐

