JS封装转换前后端接口数据格式工具函数下划线<=>大写 天天播报
(资料图)
目录
一、前言二、思路三、代码四、效果结语一、前言
这段时间接近年底,公司的业务也不是很繁忙,有些闲暇的时间,就模仿ruoyi写一个后台系统,技术栈前端是react18,后端为koa2;
在一个接口返回数据的过程中,遇到一个问题,就是后端数据保存到数据库中的命名标准是下划线,而前端的这边的命名标准是驼峰命名,所以如果直接将从数据库的数据返回给前端,便非常不优雅,网上想直接找工具包,也没找到合适的,故而自己手写了一个,如果有同样需求的小伙伴们,可以直接拿去用。
二、思路
一般后端返回给前端的数据几乎都是数组或者对象两种格式,所以我们封装的函数只需要考虑这两种情况;首先,我们这个函数需要满足后端返回给前端的数据(下划线转驼峰),前端传数据给后端(驼峰转下划线)两种情况;函数接收两个值,第一个data(数组或对象数据源),第二个type(判断要哪种转换模式:hump为下划线转驼峰,"line"为驼峰转下划线);首先,对传入的data进行判断,如果是对象则转换为数组,如果是数组则直接放行,然后深拷贝对象,防止意想不到的堆污染;因为数据的层数是不确定的,所以需要使用递归,对对象的value进行判断,如果是对象则递归;遍历data,对每个对象用forin进行遍历,然后根据type进行相应的处理,下划线还要考虑到如果是最前面的下划线,则直接删除即可;对象的改变是先保存原来的value,然后改变key后,将原来的key:value用delete删除掉,然后再重新赋值(如果有更好的方法,可以和我说,我个人也感觉这种方法不是很优雅);最后,因为上面操作为了方便操作,会将对象转化为数组格式,操作完后,需要将原先是对象的重新转化为对象,再返回回去,这样不是更改原格式;三、代码
/** 返回数据下划线驼峰互转函数封装
* @param {data} "obj或ary"
* @param {type} "hump" 为下划线转驼峰,"line" 为驼峰转下划线
* @return {Array||Object}
*/
export const formatHumpLineTransfer = (data, type = "hump") => {
// 判断传入的值是对象还是数组
const newData =
Object.prototype.toString.call(data) === "[object Object]"
? [JSON.parse(JSON.stringify(data))]
: JSON.parse(JSON.stringify(data))
function toggleFn(list) {
list.forEach((item) => {
for (const key in item) {
// 如果值为对象
if (Object.prototype.toString.call(item[key]) === "[object Object]") {
toggleFn([item[key]])
}
// 如果值为数组
else if (Object.prototype.toString.call(item[key]) === "[object Array]") {
toggleFn(item[key])
}
// 下划线 转 驼峰
else if (type === "hump") {
const keyArr = key.split("_")
let str = ""
if (keyArr.length > 1) {
keyArr.forEach((item, index) => {
if (item) {
if (index) {
const arr = item.split("")
arr[0] = arr[0].toUpperCase()
str += arr.join("")
} else {
str += item
}
}
if (!item) {
keyArr.splice(0, 1)
}
})
const newValue = item[key]
delete item[key]
item[str] = newValue
}
}
// 驼峰 转 下划线
else if (type === "line") {
const regexp = /^[A-Z]+$/
const newKey = key.split("")
const newValue = item[key]
newKey.forEach((item2, index2) => {
if (regexp.test(item2)) {
newKey[index2] = "_" + item2.toLowerCase()
}
})
delete item[key]
item[newKey.join("")] = newValue
}
}
})
}
toggleFn(newData)
// 因为上面操作为了方便操作,会将对象转化为数组格式,操作完后,需要将原先是对象的重新转化为对象
if (Object.prototype.toString.call(data) === "[object Object]") {
let obj = null
newData.forEach((item) => (obj = item))
return obj
} else {
return newData
}
}
四、效果
转换前:
转换后:
结语
希望上面的能够帮助遇到相同问题的小伙伴们,更多关于JS封装转换前后端接口数据格式的资料请关注脚本之家其它相关文章!
相关阅读
- JS封装转换前后端接口数据格式工具函数下划线<=>大写 天天播报
- 历经十五年寻女成功 蔡兴全一家回到揭阳普宁老家祭拜祖先-滚动
- 【世界播资讯】8人轮换?哈姆:我们有天赋和深度 你不可能让每个人都打
- 最新资讯:内蒙古启动重大气象灾害(暴雪)Ⅲ级应急响应
- “甘味”农企亮相安徽“绿博会” 意向签约300多万元 热点在线
- 天天微动态丨今天,再一次呼叫81192,请返航!
- 【环球快播报】国邦医药(605507):3月31日北向资金增持18.72万股
- 【咪雾之道】即将到来的武僧PTR10.1.2改动 全球速读
- 女童突发高烧,民警紧急送医
- 罕见人生|双胞胎出生后均患罕见病治疗已花百万,父亲欲卖房 世界微头条
精彩推荐
- JS封装转换前后端接口数据格式工具函数下划线<=>大写 天天播报
- 历经十五年寻女成功 蔡兴全一家回到揭阳普宁老家祭拜祖先-滚动
- 【世界播资讯】8人轮换?哈姆:我们有天赋和深度 你不可能让每个人都打
- 最新资讯:内蒙古启动重大气象灾害(暴雪)Ⅲ级应急响应
- “甘味”农企亮相安徽“绿博会” 意向签约300多万元 热点在线
- 天天微动态丨今天,再一次呼叫81192,请返航!
- 【环球快播报】国邦医药(605507):3月31日北向资金增持18.72万股
- 【咪雾之道】即将到来的武僧PTR10.1.2改动 全球速读
- 女童突发高烧,民警紧急送医
- 罕见人生|双胞胎出生后均患罕见病治疗已花百万,父亲欲卖房 世界微头条
- 【全球新视野】杭州南管理中心全力提升迎亚运窗口服务水平
- 【当前热闻】2023无锡运河外滩元宇宙混合艺术节时间+票价+演出内容
- 三国志战略版个性加点推荐(三国志战略版属性点加成) 焦点报道
- 得利斯:公司在淘宝天猫商城开设有品牌旗舰店
- 3月31日新股速递
- cqf是什么考试?每年报名时间是多久? 世界简讯
- ST天圣(002872.SZ):湖北天圣产品呋塞米注射液拟中标第八批全国药品集采
- 【环球新要闻】主办方:2023年E3游戏展宣布取消
- 第七届“渝创渝新”创业创新大赛江北区选拔赛决赛28日举行-环球今日报
- 周小川:数字货币别急着想“赢者通吃”,每隔三五年局面就会有大变化
- 速递!青海省扎实推进农牧业领域助企暖企行动
- 品质养老 乐享人生 ——前海人寿幸福小镇惠州康养社区举办一周年庆典
- 较强冷空气将影响我国大部地区 北方多地降温6-10℃ 环球新视野
- 服装消费新增量不断拓展 消费规模稳步提升 每日消息
- 焦点!美媒:特朗普被起诉,纽约警察局周五将加强安保
- 天天通讯!纺织大师好玩吗 纺织大师玩法简介
- 王皓说这个家没海东不行 基本详情讲解 世界今日报
- 全球观天下!“等等党”又赢了!机票燃油附加费年内二次下调,较最高点分别降低70元/140元
- 环球滚动:明子言 明子
- 做了小三,但我不需要得到全世界的原谅
