JoeZhao

跨出界

Hey, I’m JoeZhao, a software engineer, and a gamer.

jsonのアンダーラインをキャンプに変更する

これは私が出会ったインタビューの質問で、メモしておきます。

問題は:JSON データのすべてのキーをアンダースコアからキャメルケースに変更する方法は何ですか?

以下は回答の過程での実装方法です:

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データのすべてのキーをアンダースコアからキャメルケースに変更する
 * 
 * @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))

さらに考える:

  1. これは元のオブジェクト上で直接操作されていますが、新しいオブジェクトをコピーする方法はありますか?
  2. ES にはオブジェクトのループに対してより良い方法があるはずですが、新しい機能をどのように利用すればよいですか?

... 続く

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。