-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsnake-to-camel.ts
52 lines (45 loc) · 1.13 KB
/
snake-to-camel.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const util = require("util");
/**
* Dives into an array searching children
* @param a the origin array
*/
function _dive(a: Array<unknown>) {
return a.map((item) =>
Array.isArray(item)
? _dive(item)
: typeof item === "object"
? snakeToCamel(item)
: item
);
}
function snakeToCamel<T>(snaked: Object | Array<unknown>): T {
let camel: any = {};
if (Array.isArray(snaked)) return _dive(snaked);
for (let [key, item] of Object.entries(snaked)) {
let value = item;
if (typeof item === "object") value = snakeToCamel(item);
const parts = key.split("_");
if (parts.length > 1) {
let parsedKey = parts.shift() ?? "";
parts.forEach((part) => {
part = part.toLowerCase();
parsedKey += part.charAt(0).toUpperCase() + part.substr(1, part.length);
});
camel[parsedKey] = value;
} else camel[key] = value;
}
return camel as T;
}
const snakeCaseObj = [
"name",
{
prop_snaked: [
"prop snaked",
{
prop_1_snaked: 1,
prop_2_snaked: 2,
},
],
},
];
console.log(util.inspect(snakeToCamel(snakeCaseObj), false, null, true));