LoginSignup
5
4

More than 5 years have passed since last update.

ネストされたオブジェクト内のキー名を スネークケース → キャメルケース に変換

Last updated at Posted at 2015-01-20

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'
        }
    }
}
*/


もうちょっとスマートな書き方があるかもしれません。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4