前文
秋招到现在,不知道友友们收获如何?
这次来跟大家分享一下猫眼前端的面试经历(面试小姐姐很温柔,可惜笔者答得不咋地)
下面我们来看本次的三道手撕题
题目一:横线命名字符串转为驼峰命名字符串
题目要求:书写一个函数,将输入的字符串参数转为驼峰格式
样例1
输入:str = "zhang-wsd-sd-s"
输出:zhangWsdSdS
解题思路: 首先,使用split()函数将输入的字符串以"-"线拆分为数组arr
其次,遍历数组arr,将每个数组元素(第一个数组元素除外)首个字母转为大写
最后,使用join()函数拼接数组为字符串
- 代码如下:
function a1(str) {
let arr = str.split("-")
for (let i = 1; i < arr.length - 1 ; i++) {
arr[i] = arr[i].slice(0, 1).toUpperCase() + arr[i].slice(1)
}
return arr.join("")
}
题目二:横线命名字符串转为驼峰命名字符串(使用正则表达式解)
题目要求:书写一个函数,将输入的字符串参数转为驼峰格式
样例1
输入:str = "zhang-wsd-sd-s"
输出:zhangWsdSdS
解题思路: 直接使用正则匹配前方有"-"线的字母,转为小写即可
- 代码如下:
function a2(str) {
return str.replace(/-([a-z])/g, function(match, p1) {
return p1.toUpperCase();
});
}
题目三:合并名称
题目要求:书写一个函数,接受一个数组作为参数,数组内部由各个对象组成,每个对象有age和name属性,将age一致的对象合并到一起,并且返回
样例1
输入: let arr = [ { age:1, name:"网" },{ age:2, name:"双" },{ age:1, name:"撒" }, { age:2, name:"旦" } ]
输出:arr = [ { age:1,name: ["网", "撒"] }, { age:2,name: ["双", "旦"] }]
解题思路:
首先,利用sort函数将数组元素按照age大小重新排序
其次,遍历数组arr,利用双指针,锁定相同元素的区间,使用一个新数组存储name属性的结果,当指针元素不一致时,说明需要头部指针后移,并且使用一个对象存储之前的age属性和name数组,并且将这个对象放置到最终结果数组中
最后,当尾部指针到达最后一位时,说明循环结束,此时虽然双指针元素一致,仍需头部指针后移,并且使用一个对象存储之前的age属性和name数组,并且将这个对象放置到最终结果数组中
- 代码如下:
function a(arr) {
arr.sort((a, b) => a.age - b.age)
let j = 0,
result = [],
nameConcat = [],
obj = {}
for(let i = 0; i < arr.length; i++) {
if (arr[j].age === arr[i].age) {
nameConcat.push(arr[i].name)
} else if (arr[j].age !== arr[i].age) {
obj = {}
obj.age = arr[j].age
obj.name = nameConcat
nameConcat = []
result.push(obj)
j = i
i--
}
if (i === arr.length - 1) {
obj = {}
obj.age = arr[j].age
obj.name = nameConcat
nameConcat = []
result.push(obj)
}
}
return result
}