如何结合对象使用剩余操作符调用不可修改的addRow存储方法?
适配不可修改存储系统的动态对象传参方案
当前的核心适配矛盾:
- 存量
addRow方法的参数逻辑要求,传入的平铺参数顺序必须和之前注册的列名顺序一一对应,方法本身没有接收完整对象的处理逻辑 - 直接传入
person对象时,方法会把整个对象当成第一个、也是唯一一个参数处理,剩余参数收集到的row数组长度为1,循环给每一列赋值时,所有列拿到的值都是这个person对象本身,完全不符合预期 - 手动罗列对象属性传参的方式,会因为对象属性动态变动完全无法维护
实现步骤
结合操作符的语法匹配原方法的剩余参数逻辑,就能实现零手动维护的传参,全程不需要枚举具体属性:
- 原
addRow方法定义中使用...row的剩余操作符,本质是把所有传入的独立平铺参数,收集成一个顺序和入参完全一致的数组 - 调用方法时不需要直接把对象塞进去,只需要先提取对象的所有属性值,用展开语法把值数组打散成独立的平铺参数,就会被原方法的剩余参数逻辑正常收集,完全匹配参数接收规则
- 注册列时,直接从动态对象上提取所有属性名批量注册,不需要手写列名字符串
// 可修改部分的完整实现 // 1. 从动态person对象上提取所有键,批量注册列 const personColumns = Object.keys(person) personColumns.forEach(columnName => storageSystem.addColumn(columnName)) // 2. 提取person的所有值,用展开语法作为addRow的平铺参数,匹配原方法的剩余参数收集逻辑 storageSystem.addRow(...Object.values(person))
注意:JS中普通对象的键遍历顺序遵循属性插入顺序,只要注册列和提取值时都是从同一个对象实例上直接取键/值,就不会出现列和值的顺序错位问题,完全适配属性动态变动的场景。
后续如果要新增其他同结构的person行,只需要重复执行addRow(...Object.values(新的person实例))即可,不需要额外修改代码。
内容的提问来源于stack exchange,提问作者Bart Bongers
相关产品推荐
相关产品推荐

