【优化代码结构】函数的参数归一化
某些封装的函数,其参数具有多样性,会导致函数中会增加非常多的分支,比如下面这个 format 函数有如下几种参数方式,其中 formatter 会有很多种情况
- date:日期对象
- formatter:
- ‘date’:格式化日期
- ‘datetime’:带有时间
- 可自定义返回格式
- 自行处理的函数
- isPad:是否补零
function format(date, formatter, isPad = false) {...
}
// 2024-9-29
format(new Date(), 'date')// 2024-9-29 7:3:10
format(new Date(), 'datetime')// 2024-09-29
format(new Date(), 'date', true)// 2024-09-29 07:03:10
format(new Date(), 'datetime', true)// 2024年09月29日 07:03:10
format(new Date(), 'yyyy年MM月dd日 HH:mm:ss.ms ', true)// 2024年9月29日 7:3:10
format(new Date('2012-12-31'), (dateInfo => {const { year } = dateInfoconst thisYear = new Date().getFullYear()if (year < thisYear) {return `${thisYear - year}年前`} else if (year > thisYear) {return `${year - thisYear}年后`} else {return '今年'}
}))
可以通过 参数归一化,选择一种能涵盖其他情况的参数,在本例中选择功能最灵活且强大的函数类型参数
封装辅助函数,返回归一化的结果(函数)
function _formatNormalize(formatter){if(typeof formatter === 'function'){return formatter}if(typeof formatter !== 'string'){throw new TypeError('参数类型必须为字符串或函数')}return ()=>{...}
}function format(date, formatter, isPad = false) {formatter = _formatNormalize(formatter)formatter()
}
处理完 函数 和 非字符串 类型,继续分析 字符串类型 参数,它可能为 date、datetime以及模版字符串三种形式,挑选出其中功能最强大的方式:模版字符串,然后使用模版字符串替代date、和datetime的情况。
function _formatNormalize(formatter) {if (typeof formatter === 'function') {return formatter}if (typeof formatter !== 'string') {throw new TypeError('参数类型必须为字符串或函数')}if (formatter === 'date') {formatter = 'yyyy-MM-dd'}else if (formatter === 'datetime') {formatter = 'yyyy-MM-dd HH:mm:ss'}return (dateInfo) => {const { year, month, day, hour, minute, second, millisecond } = dateInforeturn formatter.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hour).replace('mm', minute).replace('ss', second).replace('ms', millisecond)}
}
将参数的多样性选择抽离到辅助函数中,实现对 formatter参数 归一化
function formate(date, formatter, isPad = false) {formatter = _formatNormalize(formatter)const dateInfo = {year: date.getFullYear(),month: date.getMonth() + 1,day: date.getDate(),hour: date.getHours(),minute: date.getMinutes(),second: date.getSeconds(),millisecond: date.getMilliseconds(),}if (isPad) {dateInfo.year = dateInfo.year.toString().padStart(4, '0')dateInfo.month = dateInfo.month.toString().padStart(2, '0')dateInfo.day = dateInfo.day.toString().padStart(2, '0')dateInfo.hour = dateInfo.hour.toString().padStart(2, '0')dateInfo.minute = dateInfo.minute.toString().padStart(2, '0')dateInfo.second = dateInfo.second.toString().padStart(2, '0')dateInfo.millisecond = dateInfo.millisecond.toString().padStart(3, '0')}return formatter(dateInfo)
}
相关文章:
【优化代码结构】函数的参数归一化
某些封装的函数,其参数具有多样性,会导致函数中会增加非常多的分支,比如下面这个 format 函数有如下几种参数方式,其中 formatter 会有很多种情况 date:日期对象formatter: ‘date’:格式化日期…...
CSS中height设置100vh和100%的区别
文章目录 CSS中height设置100vh和100%的区别一、引言二、高度设置的区别1、100%1.1、父元素高度固定1.2、父元素高度未定义 2、100vh2.1、视口高度2.2、不受父元素限制 三、总结 CSS中height设置100vh和100%的区别 一、引言 在前端开发中,我们经常需要设置元素的高…...
红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示
红米k60至尊版机型代码为:corot。 搭载了联发科天玑9200+处理器。此固件mtk引导为MT6985。博文将简单说明此固件的一些特点与刷写注意事项。对于NV损坏的机型。展示修改校验电阻的图示。方便改写参数等 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2…...
QEMU使用Qemu-Guest-Agent传输文件、执行指令等
简介 之前介绍过qemu传输文件,使用的挂载 / samba方式 :Qemu和宿主机不使用外网进行文件传输。 这是一种方式,这里还有另一种方式:使用Qemu-Guest-Agent,后面简称qga。 官网介绍:https://www.qemu.org/d…...
【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞
免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...
复数表示的电场
Exm加是复振幅,这是用复数表示电场,并提取只与空间有关的项复振幅就是复数表示电场,且把与空间xyz有关的量提取出来 经过验证实数E0cos(wtδx)对t求导,等于E0e^j(wtδx)对t求导再取实部 实数表示电磁波cos…...
常用快捷键整理
用加粗标注的是我个人使用时常用的,其实这个全凭个人喜好,大家可以熟悉一下自己喜欢的,都多试试,把觉得有用的记一下,多使用,后续写代码效率就会提高一些) 常用 VS 运行调试程序快捷键 编译 . 编译程序&a…...
【Transformer】长距离依赖
在自然语言处理(NLP)中,长距离依赖(Long-Range Dependencies)指的是在文本中相隔较远的两个或多个元素之间的依赖关系。这些依赖关系可以是语法上的,也可以是语义上的。例如,在句子中࿰…...
Git傻傻分不清楚(下)
进入Idea编译器 File -> New -> Project from Version Control -> URL (这个路径是要拉取项目的Github路径哦~) 设置成maven项目...
golang学习笔记27-反射【重要】
本节也是GO核心部分,很重要。包括基本类型的反射,结构体类型的反射,类别方法Kind(),修改变量的值。 目录 一、概念,基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念,基本…...
利用Puppeteer-Har记录与分析网页抓取中的性能数据
引言 在现代网页抓取中,性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据,并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库,提供…...
YOLOv5改进系列(1)——添加CBAM注意力机制
一、如何理解注意力机制 假设你正在阅读一本书,同时有人在你旁边说话。当你听到某些关键字时,比如“你的名字”或者“你感兴趣的话题”,你会自动把注意力从书上转移到他们的谈话上,尽管你并没有完全忽略书本的内容。这就是注意力机…...
无头单向非循环java版的模拟实现
【本节目标】 1.ArrayList的缺陷 2.链表 1. ArrayList的缺陷 上节课已经熟悉了 ArrayList 的使用,并且进行了简单模拟实现。通过源码知道, ArrayList 底层使用数组来存储元素: public class ArrayList<E> extends AbstractList<…...
Bert Score-文本相似性评估
Bert Score Bert Score 是基于BERT模型的一种方法。它通过计算两个句子在BERT模型中的嵌入编码之间的余弦相似度来评估它们的相似度。BERTScore考虑了上下文信息和语义信息,因此能够更准确地衡量句子之间的相似度。 安装 pip install bert-score 使用例子 一个…...
Pyenv管理Python版本,conda之外的另一套python版本管理解决方案
简介 Pyenv 是一个 python 解释器管理工具,可以对计算机中的多个 python 版本进行管理和切换。为什么要用 pyenv 管理python呢,用过的 python 人都知道,python 虽然是易用而强大的编程语言,但是 python 解释器却有多个版本&#…...
快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标
Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标,能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱,无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成(RAG)聊天…...
css的页面布局属性
CSS Flexbox(Flexible Box Layout)是一种用于页面布局的CSS3规范,它提供了一种更加高效的方式来布置、对齐和分配容器内元素的空间,即使它们的大小是未知或者动态变化的。Flexbox很容易处理一维布局,即在一个方向上&am…...
RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!
所有 AI Infra 都在探寻规格和性能的最佳平衡,如何构建高可用的云边端协同架构? 语音 AI 实现 human-like 的最后一步是什么? AI 视频的爆炸增长,给新一代编解码技术提出了什么新挑战? 当大模型进化到实时多模态&am…...
【React】入门Day01 —— 从基础概念到实战应用
目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发,是用于构建 Web 和原生…...
<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现
10生成器与python实现 如果是曲线规律的数据集,则需要把模型变复杂。如果是噪音较大,则需要做特征工程。 随机种子的知识点补充: 根据不同库中的随机过程,需要用对应的随机种子: 比如 llist(range(5)) random.shuf…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
