在日常工作生活中,我们在js中用replace函数可能是到处可见,但是一直以来我用的都是比较常见浅显的功能,比如替换一个字符等等。
这次再看一道算法题的时候,偶然发现我们的replace能给我们提供很多便利,先上代码
function converter(obj) {
for (key in obj) {
let reg = /_([a-zA-Z])/g
let result = key.replace(
reg,
function (match, captureGroup1, offset, string, groups) {
console.log('match = ', match)
console.log('captureGroup1 = ', captureGroup1)
console.log('offset = ', offset)
console.log('string = ', string)
console.log('groups这里暂不讨论 = ', groups)
return captureGroup1.toUpperCase()
}
)
return `{${result + ':' + obj[key]}}`
}
}
// 调用
const a = { a_bc_def_aaa: 1111 }
console.log(converter(a))
看起来是不是很简单,这里正则代表的是匹配下划线加字母,如_a(这里我就不多提了,日后有正则相关的博客我会发表出来),下面我们来看我们的重点函数replace
剧MDN介绍
第一个参数match:代表匹配的子字符串,如match = _b
第二个参数captureGroup:这里有个捕获组的概念,我总结了一下,无论是普通还是命名捕获组,都是以一个括号对的呈现,一个括号对()代表一个捕获组即p1,p2,...,pN,这里打印的是captureGroup1 = b
第三个参数offset代表的是偏移量,其实就是匹配到的子字符串首的index值,如offset = 1
第四个参数代表的是检查的原始字符串,如string = a_bc_def_aaa
第五个参数代表的是命名捕获组组成的对象,这里暂不讨论。如groups这里暂不讨论 = undefined
参数梳理完了,我再加几个示例大家看一下就知道几个参数的具体意义
const str = 'ababdd'
str.replace(/(b)(d)/g, function () {
console.log(arguments) // ["bd", "b", "d", 3, "ababdd"]
})
两个括号对,对应两个捕获组,所以第二个参数有b,d
const str = 'ababdd'
str.replace(/(a)(b)(d)/g, function () {
console.log(arguments) // ['abd', 'a', 'b', 'd', 2, 'ababdd']
})
增加一个捕获组,所以第二个参数有a,b,d
参数的确切数量取决于第一个参数是否为 RegExp 对象,以及它有多少个捕获组。
今天主要是对replace函数的拓展和深入一步研究,欢迎大家来一起讨论