提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议
由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题,在这里只提供部分原题代码
本题目为:备赛蓝桥杯之第十六届模拟赛2期职业院校组第四题:地址识别
题目:
经过运行环境运行之后的效果如下:
本题需要做的代码如下:
/**
* @description 识别粘贴的联系人信息
* @param {String} text: 联系人信息
* @return {Object} 识别出来的信息对象,如 { name: "张三", phone: 123456, address: "南京路1234号" }
*/
function parseContactInfo(text) {
// TODO: 请补充代码
}
本题目标如下:
请完善
js/index.js
中parseContactInfo
函数的TODO
部分代码,实现以下目标:在地址输入框下方的文本域内(
id="info"
)输入数据后,点击识别按钮(id="transferBtn"
)时,对输入的数据进行提取。parseContactInfo
函数接收一个字符串,为信息输入框(id="info"
)输入的数据(只会包含姓名、电话、地址三部分信息,各部分信息之间以空格分隔),要返回一个对象,对象中包含提取的信息,例如输入的数据为:15277775555 重庆市渝中区解放碑步行街99号 刘十二
返回的数据为:
{ name: "刘十二", phone: 15277775555, address: "重庆市渝中区解放碑步行街99号" }
name
表示联系人姓名。phone
表示联系人电话。address
表示联系人地址。每个信息的提取规则如下:
name
:2-4
位的中文字符。phone
:11
位的数字。address
:中文字符开头且由中文、英文、数字的组成的至少4
位的字符。提示:
- 匹配中文的正则为:
[\u4e00-\u9fa5]
。需要注意的是,输入的各部分信息的顺序可能是不一致的,例如输入的数据为:
周八 15277775555 西湖7号,
或者
西湖7号 15012345678 周八
返回的数据也为:
{ name: "周八", phone: 15012345678, address: "西湖7号" }
说人话:
其实就是将输入的字符分割出来对应到结果上去,期间输入的字符还有可能不单纯的是按照顺序来的
本题作者想说
答案:
function parseContactInfo(text) {
// TODO: 请补充代码
let resultObj = {}
let newText = text.split(" ")
let findNameRuler = /^[\u4e00-\u9fa5]{2,4}$/
let nameIndex = newText.findIndex((item) => findNameRuler.test(item));
resultObj.name = newText[nameIndex]
newText.splice(nameIndex , 1)
let findPhoneRuler = /^\d{11}$/
let phoIndex = newText.findIndex((item) => findPhoneRuler.test(item))
resultObj.phone = newText[phoIndex]
newText.splice(phoIndex , 1)
resultObj.address = newText[0]
return resultObj
}
作者自我解释版:
function parseContactInfo(text) {
// TODO: 请补充代码
// 定义一个结果,用于储存结果
let resultObj = {}
// 将原文本进行解构,并把所有的字符结构成一个数组
// 相比[...text]来说,[...text]只是把所有的字符都一一拆出来成为数组项,如[0:"重",1:"庆"...]
// 而对于split(" ")则是把原文本根据“ ”拆成三个大的数组项,这样便省去了很多麻烦,如[0:"110",1:"警察",2:"警察局"]
let newText = text.split(" ")
// 用正则表达式表示找到中文的正则表达式,并限制2-4个字符,以区分是地址还是姓名
// /^:表示匹配字符串的开始。
// [\u4e00-\u9fa5]:这是一个字符类
// {2,4}:表示前面的字符类(即汉字)至少出现2次,最多出现4次。
// $/:表示匹配字符串的结束。
let findNameRuler = /^[\u4e00-\u9fa5]{2,4}$/
// 通过findIndex属性,将在解构后的数组中符合上述寻找名字的正则表达式的数组项
// 返回一个数字,即在结构后数组中符合正则表达式的下标
let nameIndex = newText.findIndex((item) => findNameRuler.test(item));
// 将结构后的数组中第符合正则表达式的下标个数组项赋值给结果数组
resultObj.name = newText[nameIndex]
// 将已经找到的数组删掉!避免下一次寻找时重复
newText.splice(nameIndex , 1)
// 方法类似,找到11位电话号码
let findPhoneRuler = /^\d{11}$/
let phoIndex = newText.findIndex((item) => findPhoneRuler.test(item))
resultObj.phone = newText[phoIndex]
newText.splice(phoIndex , 1)
// 将最后剩下的一个,只有地址没有找到,便直接赋值给结果数组即可
resultObj.address = newText[0]
// 返回结果数组
return resultObj
}
感谢观看此篇文章,谢谢大家的支持,本片文章只是我自己学习的历程,有些写的不好地方欢迎大家交流改动。
长路漫漫,我们还需努力!