本文介绍一种结构清晰、无冗余的 javascript 方案,通过提取公共字符串处理逻辑 + 分离目标定位逻辑,实现对 header、body(末节内容)和 footer 的统一后缀追加,确保每个属性引用仅出现一次,且不破坏原始对象结构。
在实际开发中,当需要向多个不同位置的字符串动态追加内容(如后缀),而这些字符串又分散在嵌套对象或数组中时,很容易写出大量重复的条件判断与拼接逻辑——正如原始代码所示:header、sections[sections.length - 1].content 和 footer 各自被重复访问三次(一次判空、一次加空格、一次拼接),既难维护又违背 DRY 原则。
核心思路是职责分离:
以下是优化后的完整实现:
const articleComponents = {
header: "",
sections: [
{ title: "Intro", content: "Welcome to the guide." },
{ title: "Details", content: "Learn more below." }
],
footer: ""
};
// 类型安全提示(可选,TypeScript 中建议用 enum)
const Target = {
HEADER: "HEADER",
BODY: "BODY",
FOOTER: "FOOTER"
};
// ✅ 纯函数:安全拼接后缀(自动补空格)
function processString(str, suffix) {
return str.endsWith(" ") ? `${str}${suffix}` : `${str} ${suffix}`;
}
// ✅ 封装数组末项更新逻辑
function processSections(sections, suffix
) {
if (sections.length === 0) {
throw new Error("Cannot append to empty sections array");
}
const last = sections[sections.length - 1];
last.content = processString(last.content, suffix);
}
// ✅ 主函数:单次访问 + 单次赋值,零冗余
function appendSuffix(suffix, target) {
switch (target) {
case Target.HEADER:
articleComponents.header = processString(articleComponents.header, suffix);
break;
case Target.FOOTER:
articleComponents.footer = processString(articleComponents.footer, suffix);
break;
case Target.BODY:
processSections(articleComponents.sections, suffix);
break;
default:
throw new Error(`Invalid target: ${target}`);
}
}✅ 调用示例:
appendSuffix("v2", Target.HEADER); // → header: "v2"
appendSuffix("— updated", Target.BODY); // → 最后一节 content: "Learn more below. — updated"
appendSuffix("© 2025", Target.FOOTER); // → footer: "© 2025"? 关键优势总结:
⚠️ 注意:JavaScript 中字符串不可变,因此所有赋值(如 obj.prop = ...)本质是替换引用。本方案正是利用这一特性,在保持接口简洁的同时,完全满足“不修改对象结构”的约束——你依赖的始终是 articleComponents 的原始 shape,而非某个深层引用地址。
# vue
# react
# javascript
# java
# typescript
# app
# ai
# switch
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】
如何使用Golang理解结构体指针方法接收者_Golang修改字段实践
Win11怎么把图标拖到任务栏_Win11固定应用快捷方式指南【方法】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
Win11怎么设置任务栏图标大小_Windows11注册表TaskbarSi修改
如何使用Golang捕获测试日志_Golang testing日志记录方法
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
如何使用Golang log记录不同级别日志_Golang log Println与Fatal示例
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】
Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复
php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】
C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】
Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南
如何在 Go 中调用动态链接库(.so)中的函数
Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
Win10如何更改网络连接_Windows10以太网属性IP配置
Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】
PHP主流架构怎么集成Redis缓存_配置步骤【方法】
mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】
Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Python装饰器设计思路_功能增强机制说明【指导】
PHP cURL GET请求:正确设置认证与自定义请求头的完整教程
Windows10怎么卸载预装软件_Windows10预装软件卸载步骤【教程】
Python实现图数据库操作_Neo4j核心CRUD与图算法解析
Python模块的__name__属性如何由导入方式决定?
windows如何禁用驱动程序强制签名_windows高级启动设置指南
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
Python随机数生成_random模块说明【指导】
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
如何使用正则表达式批量替换重复的 *- 模式为固定字符串
Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】
Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】
Windows10如何更改任务栏高度_Win10解除锁定调整大小
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何在Golang中配置代码格式化工具_使用gofmt和goimports
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
Python 模块的 __name__ 属性如何由导入方式决定?
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】
Win11怎么开启远程桌面_Win11系统远程桌面启用开关
php删除数据怎么软删除_添加is_del字段标记删除【技巧】
XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
C#如何在一个XML文件中查找并替换文本内容
2025-12-29
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。