change json underline to camp

这是碰到的一道面试题，记录一下。

问题是：如何 json 数据的所有 key 从下划线改为驼峰

下面是答题过程中的实现方法：

Copy
const testData = {
a_bbb: 123,
a_g: [1, 2, 3, 4],
a_d: {
s: 2,
s_d: 3
},
a_f: [1, 2, 3, {
a_g: 5
}],
a_d_s: 1
}

/**
* _w 的形式转成 W
*/
function toCame(str) {
return str.replace(/\_(\w)/g, function(a, b) {
return b.toUpperCase();
});
}

/**
* 将一个json数据的所有key从下划线改为驼峰
*
* @param {object | array} value 待处理对象或数组
* @returns {object | array} 处理后的对象或数组
*/
function mapKeysToCamelCase(data) {
if(data instanceof Array) {
data.forEach(function(v, index) {
mapKeysToCamelCase(v);
});
} else if(data instanceof Object) {
Object.keys(data).forEach(function(v, index) {
var newValue = toCame(v);
console.info(newValue);

// 如果名称一致，说明可能不存在转化情况
if(newValue != v) {
data[newValue] = data[v];
delete data[v];
}

// 递归
mapKeysToCamelCase(data[newValue]);
});
}

return data;
}

console.log(mapKeysToCamelCase(testData))

进一步思考：

这是直接在原有对象上操作的，如何拷贝一个新的对象呢？

ES 对于 Object 的循环应该有更好的方法，如何利用新特征？

... 待续