如何用属性访问语法获取对象嵌套/组合属性,适配数据库存储列配置?
问题描述
现有如下数据对象:
const myObject = { firstName:'fname', lastName:'lname', role:{ roleID:1, description:'Admin' }, phone: '12345', email:'example@gmail.com' }
目前通过myObject['phone']、myObject['email']这类字符串键的方式访问属性,配合以下列配置在可调整列顺序的表格中展示数据:
const TABLE_COLUMNS=[{Header:'Phone',accessor:'phone'},{Header:'Email',accessor:'email'},...]
但遇到两类场景无法直接处理:
- 需要拼接
firstName和lastName作为name字段展示 - 需要访问嵌套属性
myObject.role.description作为role字段展示
同时,列配置需要存入MySQL数据库,因此不能在配置中使用函数属性,请问如何沿用当前的属性访问逻辑实现需求?
解决方案
方式一:预处理数据,添加计算字段
在渲染表格前,给原始数据对象衍生出需要的计算字段,之后就能像普通属性一样用字符串键访问:
// 预处理单个数据对象 const processedObj = { ...myObject, name: `${myObject.firstName} ${myObject.lastName}`, roleDesc: myObject.role.description }; // 对应的列配置(纯字符串结构,可直接存入数据库) const TABLE_COLUMNS = [ {Header:'Name',accessor:'name'}, {Header:'Role',accessor:'roleDesc'}, {Header:'Phone',accessor:'phone'}, {Header:'Email',accessor:'email'} ]; // 沿用原有访问方式 console.log(processedObj['name']); // 输出 "fname lname" console.log(processedObj['roleDesc']); // 输出 "Admin"
这种方式逻辑简单,完全兼容现有访问模式,没有额外解析成本。
方式二:自定义解析函数,支持路径/特殊标识
如果不想修改原始数据,可以定义一个通用解析函数,让列配置的accessor支持嵌套路径或约定的特殊字符串,通过函数解析获取对应值:
// 通用值解析函数 function getTargetValue(obj, accessor) { // 处理姓名拼接的约定标识 if (accessor === 'fullName') { return `${obj.firstName} ${obj.lastName}`; } // 处理嵌套属性路径,比如"role.description" if (accessor.includes('.')) { return accessor.split('.').reduce((current, key) => { return current ? current[key] : undefined; }, obj); } // 默认返回普通属性 return obj[accessor]; }
对应的列配置(纯字符串,可存入数据库):
const TABLE_COLUMNS = [ {Header:'Name',accessor:'fullName'}, {Header:'Role',accessor:'role.description'}, {Header:'Phone',accessor:'phone'}, {Header:'Email',accessor:'email'} ];
使用时通过解析函数取值:
console.log(getTargetValue(myObject, 'fullName')); // 输出 "fname lname" console.log(getTargetValue(myObject, 'role.description')); // 输出 "Admin" console.log(getTargetValue(myObject, 'phone')); // 输出 "12345"
这种方式无需修改原始数据,通过约定字符串扩展访问能力,同样满足列配置存入数据库的要求。
内容的提问来源于stack exchange,提问作者Selim Choueiter
相关产品推荐
相关产品推荐

