2017/06/12

[JavaScript]オブジェクトのすべてのキーをPascalCaseやcamelCase、snake_case、kebab-caseに変換する

JavaScriptやNode.jsでは、変数名やオブジェクトのプロパティをcamelCaseにすることが多い。しかし、APIからのレスポンスはPascalCaseであることが多いため、JavaScript内で使うとres.ExampleFieldのようになり違和感を覚える。

そこで、オブジェクトのすべてのキーをPascalCaseやcamelCase、snake_case、kebabu-caseなどに変換する関数を実装してみた。


オブジェクトのすべてのキーを変換する


// utils.js
import * as _ from 'lodash';

export default class Utils {
  // プリミティブ型かどうか判定する
  static isPrimitive(val) {
    return _.includes(['string',  'number', 'boolean'], typeof val);
  }

  // キーを変換する
  static localizeKeys(object, toStyle = _.camelCase) {
    function _localize(obj) {
      // プリミティブ型なら変換しない
      if (Utils.isPrimitive(obj) || obj === null) {
        return obj;
      }

      // 配列の中身がオブジェクトの場合のみキーを変換する
      if (Array.isArray(obj)) {
        const dest = [];
        obj.forEach(a => {
          if (Utils.isPrimitive(a) || a === null)  return dest.push(a);
          if (typeof a === 'object') return dest.push(_localize(a));
        });
        return dest;
      }

      // オブジェクトのキーを変換する
      if (typeof obj === 'object') {
        const dest = {};
        Object.keys(obj).forEach(a => {
          if (Utils.isPrimitive(obj[a]) || obj[a] === null) {
            return dest[toStyle(a)] = obj[a];
          }

          if (typeof obj[a] === 'object') {
            return dest[toStyle(a)] = _localize(obj[a]);
          }
        });
        return dest;
      }
    }

    return _localize(object);
  }
}


// オブジェクト
const obj = {
  'Hoge': 'hoge',
  'FooBar': 'fooBase'
};

// camelCase
Utils.localizeKeys(obj, _.camelCase);

// snake_case
Utils.localizeKeys(obj, _.snakeCase);

// kebab-case
Utils.localizeKeys(obj, _.kebabCase);

// PascalCase
_.mixin({ pascalCase: _.flow(_.camelCase, _.upperFirst) });
Utils.localizeKeys(obj, _.pascalCase);


includesや各ケースへの変換にlodashを使っている。
includesに関してはArray.prototype.includes()というメソッドがあるのだが、VSCodeで書こうとすると「そんなメソッドないよ」と怒られてしまう。



参考サイト





以上

written by @bc_rikko

0 件のコメント :

コメントを投稿