phpフレームワークなどからjsonでデータを取得したりすると、オブジェクトのキー名がスネークケースであることがよくあると思います。これをすべてキャメルケースに変換したいです。
関数が自分自身を呼び出すarguments.calleeを使って高階関数というのをつくればいけそうだと分かりました。
- ライブラリにUnderscore.jsを使用しています。
- スネークケース → キャメルケースの箇所はANTON072さんのキャメルケースに変換するを参考にさせて頂きました。
- jsfiddleにあげました
- 追記 arguments.callee が strict modeでは使えないという重大な問題に気づきました。名前付き関数を呼び出すやり方に変更しました。
//スネークケースの文字列をキャメルケースの文字列に変換
function snakeToCamel(str) {
if (!_.isString(str)) {
return str;
}
return str.replace(/_([a-z])/ig, function (all, letter) {
return letter.toUpperCase();
});
};
//オブジェクトのkeyにfuncを適用し
//それぞれのvalueがオブジェクトだった場合にも再帰的に自分自身を適用する関数
function objKeysMap(obj, func) {
var values = _.values(obj).map(function (a) {
return _.isObject(a) && objKeysMap(a, func) || a;
});
return _.object(_.keys(obj).map(func), values);
};
//以下サンプル
//スネークケースのデータ
var snake = {
key_name:{
child_key_name:{
grand_child_key_name:'value'
}
}
};
var camel = objKeysMap(snake, snakeToCamel);
console.log(camel);
/*
{
keyName:{
childKeyName:{
grandChildKeyName:'value'
}
}
}
*/
//もとのデータはそのままです
console.log(snake);
/*
{
key_name:{
child_key_name:{
grand_child_key_name:'value'
}
}
}
*/
もうちょっとスマートな書き方があるかもしれません。