这是一次面试中遇到的题目,考察了深拷贝 + 数组/字符串的基础操作。特此记录下来,用于后续复习。
输入结果如下:
{
name: "John",
his_age: 12,
his_info: {
more_detail: {
more_and_more_detail: {
his_height: 23,
},
t_test: 222,
},
},
}
要求输出结果如下:
{
name: "John",
hisAge: 12,
hisInfo: {
moreDetail: {
moreAndMoreDetail: {
hisHeight: 23,
},
tTest: 222,
},
},
}
下划线转小驼峰,实现代码如下:
function underscoreToCamel(str) {
const list = str.split("_");
// 当有且只有一个子符串组成时,不格式化
if (list.length === 1) {
return str;
}
return list.reduce((pre, cur) => {
if (pre === '') {
return pre + cur;
}
return pre + cur.charAt(0).toUpperCase() + cur.substr(1);
}, '');
}
function recursive(obj) {
const newObj = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
const newKey = underscoreToCamel(key);
newObj[newKey] = typeof obj[key] === 'object' ? recursive(obj[key]) : obj[key]; // 如果当前值是对象类型,则继续递归处理
}
}
return newObj;
}
console.log(JSON.stringify(recursive(obj)))
这里简单扩展一下,小驼峰转下划线的方式:
var input = 'someTextHere';
var o1 = input.split(/(?=[A-Z])/).join('_').toLowerCase(); // split()的参数也可以是一个正则表达式