能否通过字符串路径动态引用嵌套对象数组属性并赋值?
问题:能否通过字符串路径给对象/数组赋值?
现有代码
定义的数组:
var object_ = [ { "name":"Akshay" } ];
定义的路径字符串:
var object_keys = "[0]['other_data']";
已知的正确赋值方式:
object_[0]['other_data'] = { "age":20, "Sex": "male" }
疑问
能否通过以下方式实现相同的赋值操作?
object_[object_keys] = { "age":20, "Sex": "male" }
回答
直接这么写不行。因为object_keys是字符串"[0]['other_data']",JavaScript会把它当成数组的一个普通属性名执行,最终会给object_新增一个名为"[0]['other_data']"的属性,完全达不到修改数组第0项的other_data的目的。
如果想通过这种字符串路径实现赋值,有两种可行方案:
- 使用
eval(不推荐)eval可以直接解析并执行字符串中的代码,能实现需求,但如果路径字符串来自用户输入等不可信来源,会有严重的安全风险:
eval(`object_${object_keys} = { "age":20, "Sex": "male" }`);
- 手动解析路径(更安全)
自己写个函数解析路径字符串,逐层访问对象/数组后完成赋值:
function setValue(obj, pathStr, value) { // 提取路径中的索引和属性名 const pathSegments = pathStr.match(/\d+|'([^']+)'/g).map(segment => { if (segment.startsWith("'")) { return segment.slice(1, -1); // 去掉属性名的单引号 } return parseInt(segment, 10); // 把索引转为数字 }); let currentObj = obj; // 遍历路径到倒数第二层 for (let i = 0; i < pathSegments.length - 1; i++) { currentObj = currentObj[pathSegments[i]]; if (!currentObj) { throw new Error("路径对应的层级不存在"); } } // 给最后一层赋值 currentObj[pathSegments[pathSegments.length - 1]] = value; } // 调用函数实现赋值 setValue(object_, object_keys, { "age":20, "Sex": "male" });
内容的提问来源于stack exchange,提问作者Akshay Dhiman
相关产品推荐
相关产品推荐

