如何将多层级字符串转换为对象键?单层逻辑无法适配该场景
解决多层级字符串路径访问/赋值对象属性的问题
嘿,这个问题我之前也踩过坑!当你直接用object["common.device.type.pc.name"]的时候,JS会把整个字符串当作单个属性名来处理,而不是自动解析成嵌套的路径,所以自然没法访问到你想要的层级。咱们用简单的函数就能搞定这个需求:
1. 实现多层级属性赋值
先写一个通用的赋值函数,它会把字符串路径拆分成单个键,然后一步步深入对象,自动创建不存在的中间层级:
function setNestedProperty(obj, path, value) { // 把路径按`.`拆分成键数组 const keys = path.split('.'); // 用临时变量跟踪当前遍历的层级 let currentLevel = obj; // 遍历到倒数第二个键,创建中间的空对象(如果不存在的话) for (let i = 0; i < keys.length - 1; i++) { const key = keys[i]; // 如果当前层级没有这个键,或者它不是对象,就初始化空对象 if (!currentLevel[key] || typeof currentLevel[key] !== 'object') { currentLevel[key] = {}; } // 进入下一层级 currentLevel = currentLevel[key]; } // 给最后一个键赋值 currentLevel[keys[keys.length - 1]] = value; }
使用示例
const myObject = {}; const targetPath = "common.device.type.pc.name"; // 赋值 setNestedProperty(myObject, targetPath, "我的PC设备名称"); // 验证结果 console.log(myObject.common.device.type.pc.name); // 输出:我的PC设备名称
2. 实现多层级属性获取
如果需要根据字符串路径读取属性,也可以写一个类似的函数:
function getNestedProperty(obj, path) { const keys = path.split('.'); let currentLevel = obj; for (const key of keys) { // 如果中间层级不存在,直接返回undefined(或者你可以自定义默认值) if (!currentLevel || typeof currentLevel !== 'object') { return undefined; } currentLevel = currentLevel[key]; } return currentLevel; }
使用示例
// 读取刚才赋值的属性 const deviceName = getNestedProperty(myObject, "common.device.type.pc.name"); console.log(deviceName); // 输出:我的PC设备名称 // 访问不存在的路径,返回undefined const invalidValue = getNestedProperty(myObject, "common.device.phone.name"); console.log(invalidValue); // 输出:undefined
额外注意点
如果你的属性名本身包含.(比如user.info.email.address里的info.email是一个键),那直接用split('.')就会出错。这种场景下可以换用其他分隔符(比如_或者/),或者提前对路径里的.做转义处理,比如用\\.表示实际的点,再写逻辑区分转义的点和分隔用的点。
内容的提问来源于stack exchange,提问作者kkangil
相关产品推荐
相关产品推荐

