如何通过包含对象名与属性名的字符串访问对象属性
如何通过包含对象名与属性名的字符串访问对象属性
嘿,这个需求我之前做表单校验的时候也碰到过!你说的没错,直接用window[array[0]]肯定行不通——它会傻愣愣地去全局里找一个叫name.first的变量,而不是先定位到name对象再去取first属性。咱们可以自己写个轻量的工具函数来解决这个问题,思路特别直观:把字符串按.拆成路径片段,然后一步步往下“钻”着访问属性。
先给你看最通用的实现:
function getNestedProperty(path, targetObj = window) { // 把路径字符串按点分割成数组,比如"name.first"变成["name", "first"] const pathSegments = path.split('.'); // 用reduce一步步遍历路径,从目标对象开始逐层访问 return pathSegments.reduce((currentObj, segment) => { // 如果当前层级的对象不存在,直接返回undefined,避免报错中断 return currentObj ? currentObj[segment] : undefined; }, targetObj); }
接下来结合你的例子来用:
// 先模拟你的全局变量/对象 const name = { first: "Alice", last: "Smith" }; const age = 30; const phone = "123-4567"; const array = [ "name.first", "name.last", "age", "phone" ]; // 用forEach遍历验证每个路径 array.forEach(path => { const propertyValue = getNestedProperty(path); console.log(`${path} 的值是:`, propertyValue); }); // 用filter筛选出存在有效属性的路径 const validPaths = array.filter(path => getNestedProperty(path) !== undefined); console.log("有效属性路径:", validPaths);
如果你的对象不是全局的,而是局部的(比如一个user对象),也完全适配,只需要把目标对象作为第二个参数传进去就行:
const user = { profile: { fullName: { firstName: "Bob", lastName: "Johnson" }, age: 25 }, contact: { phone: "987-6543" } }; // 访问局部对象的嵌套属性 const firstName = getNestedProperty("profile.fullName.firstName", user); console.log(firstName); // 输出 "Bob"
最后提个小注意点:如果你的属性名里本身包含.或者特殊字符,那这个按.拆分的方法就不适用了,但看你的例子都是常规的命名,所以完全没问题。另外这个函数还做了容错——如果路径中间某一层不存在(比如你写了name.middle但name里没有middle属性),它会返回undefined而不是抛出错误,这样在遍历的时候不会打断流程。
内容来源于stack exchange
相关产品推荐
相关产品推荐

