将给定的JSON中所有带“_”的key转为驼峰写法(如果“_”出现在key的开头或结尾,直接删除),并输出最终的结果

题目:将给定的JSON中所有带“_”的key转为驼峰写法(如果“_”出现在key的开头或结尾,直接删除),并输出最终的结果

// 将给定的JSON中所有带“_”的key转为驼峰写法(如果“_”出现在key的开头或结尾,直接删除),并输出最终的结果
// 	示例:
// 	输入:{
//         name: 'Persons List',
//         total_count: 2,
//         persons_list: [
//           {
//             person_name: 'Tom',
//             _gender: '1',
//             age_: 37
//           },
//           {
//             person_name: 'Rose',
//             _gender: '0',
//             age_: 18
//           }
//         ]
//       }
// 	输出:
// 	{
//         name: 'Persons List',
//         totalCount: 2,
//         personsList: [
//           {
//             personName: 'Tom',
//             gender: '1',
//             age: 37
//           },
//           {
//             personName: 'Rose',
//             gender: '0',
//             age: 18
//           }
//         ]
//       }

解决:

/ 匹配下划线"_"与它后边的第一位字母,并将字母大写
function toUpper(data) {
  return data.replace(/_(\w)/g,(item,upper) => {
    return upper.toUpperCase()
  })
}

function toHump(obj) {
  if(obj instanceof Array) {
    obj.forEach((item) => {
      toHump(item)
    })
  }else if(obj instanceof Object) {
    Object.keys(obj).forEach((key) => {
      // 将出现在key的开头或结尾的下划线"_",直接删除
      let newKey = key.replace(/^_|_$/gm,"")
      newKey = toUpper(newKey)
      if(newKey !== key) {
        obj[newKey] = obj[key]
        delete obj[key]
      }
      toHump(obj[newKey])
    })
  }
}

let obj = {
        name: 'Persons List',
        total_count: 2,
        persons_list: [
          {
            person_name: 'Tom',
            _gender_a_: '1',
            age_: 37
          },
          {
            person_name: 'Rose',
            _gender: '0',
            age_: 18
          }
        ]
      }

toHump(obj);
console.log(obj);

主要用到了字符串的 replace() 方法正则表达式

replace()

该函数接收两个参数,

第一个参数可以是字符串或者正则表达式,描述了需要替换的子字符串;

第二个参数则可以是一个字符串或者一个回调函数,用来描述替换值。字符串是不可变对象,该函数不改变原字符串,返回值为替换后的字符串。

 
str.replace(regexp|substr, newSubStr|function)

 例如:

// 字符串直接替换
let a = "asdf".replace("sd","wer")
console.log(a); // awerf

// 通过匹配替换字符串
//  \d 匹配数字
let b = "asd45f6".replace(/\d/,"_")
console.log(b); // asd_5f6

// 函数的返回值替换字符串的匹配部分
// item,index,string 匹配部分,匹配部分的第一个索引,被匹配的字符串
let c = "asdfsd".replace("sd",(item,index,string) => {
  console.log(item,index,string); // sd 1 asdf
  // 匹配到的字母大写
  return item.toUpperCase()
})
console.log(c)  // aSDfsd

// 函数返回值替换正则匹配到的内容
// 匹配下划线和字母数字下划线 "_[a-zA-Z0-9_]"
let d = "_dffsc_fvv_ffd_".replace(/_(\w)/gm,(item) => {
  return item.toUpperCase()
})
console.log(d)  // _Dffsc_Fvv_Ffd_
正则匹配

匹配规则可以看 正则表达式-CSDN博客

推荐使用 regex101: build, test, and debug regex在线工具调试,基本使用方法可以看【正则表达式】regex101超好用的正则表达式测试和学习工具(内含使用教程、Python和C#正则表达式代码示例)_正则101-CSDN博客

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值