そこで、オブジェクトのすべてのキーを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 件のコメント :
コメントを投稿