這是碰到的一道面試題,記錄一下。
問題是:如何將 json 數據的所有 key 從下劃線改為駝峰命名法
下面是答題過程中的實現方法:
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 的循環應該有更好的方法,如何利用新特徵?
... 待續