You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化嵌套对象指定属性的导出逻辑,降低维护成本?

优化嵌套对象指定属性的导出方案

问题场景

现有嵌套对象如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:31:22