如何优化嵌套对象指定属性的导出逻辑,降低维护成本?
优化嵌套对象指定属性的导出方案
问题场景
现有嵌套对象如下:
const object = { cars: { car1: { model: "Car 1 model", name: "Car 1 name", // 需要导出的属性 }, car2: { model: "Car 2 model", name: "Car 2 name", // 需要导出的属性 }, }, bikes: { bike1: { model: "Bike 1 model", name: "Bike 1 name", // 需要导出的属性 }, bike2: { model: "Bike 2 model", name: "Bike 2 name", // 需要导出的属性 }, }, };
当前手动逐个导出指定属性的方式:
export const car1Name = object.cars.car1.name; export const car2Name = object.cars.car2.name; export const bike1Name = object.bikes.bike1.name; export const bike2Name = object.bikes.bike2.name;
这种方式在对象新增属性时需要手动维护导出代码,维护成本高,以下是几种优化方案:
方案1:批量导出为统一对象
通过遍历对象自动提取所有需要的name属性,整理成一个对象后导出,新增属性无需修改导出代码:
const exportedNames = {}; // 遍历一级分类(cars、bikes) for (const category in object) { if (Object.prototype.hasOwnProperty.call(object, category)) { // 遍历分类下的每个条目 for (const itemKey in object[category]) { if (Object.prototype.hasOwnProperty.call(object[category], itemKey)) { // 生成形如`car1Name`的键名并赋值 const exportKey = `${itemKey}Name`; exportedNames[exportKey] = object[category][itemKey].name; } } } } // 导出整理后的对象 export default exportedNames;
使用方式:
import names from './your-file-path.js'; console.log(names.car1Name); // 输出"Car 1 name" // 新增车辆后直接通过names.car3Name访问,无需修改导出代码
方案2:动态生成命名导出
如果需要保持原有命名导出的调用方式(import { car1Name }),可以通过动态修改模块导出实现自动导出:
const exportedNames = {}; // 同方案1的遍历逻辑 for (const category in object) { if (Object.prototype.hasOwnProperty.call(object, category)) { for (const itemKey in object[category]) { if (Object.prototype.hasOwnProperty.call(object[category], itemKey)) { const exportKey = `${itemKey}Name`; exportedNames[exportKey] = object[category][itemKey].name; } } } } // 动态添加到模块导出中 Object.entries(exportedNames).forEach(([key, value]) => { exports[key] = value; });
使用方式:
import { car1Name, bike3Name } from './your-file-path.js'; console.log(car1Name); // 输出"Car 1 name"
方案3:提供按需获取的工具函数
无需提前导出任何属性,而是提供一个函数让调用方按需获取指定的name值,完全避免维护导出列表:
export const getName = (category, itemKey) => { // 使用可选链操作符避免属性不存在时报错 return object[category]?.[itemKey]?.name; };
使用方式:
import { getName } from './your-file-path.js'; console.log(getName('cars', 'car1')); // 输出"Car 1 name" // 新增车辆后直接调用getName('cars', 'car3')即可
方案对比
- 方案1:适合需要批量使用大部分
name属性的场景,调用直观,无需额外函数调用 - 方案2:兼容原有命名导出的调用习惯,无需修改现有引用代码
- 方案3:最灵活,适合按需获取少量属性的场景,完全无需维护导出配置
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

