Я бы отделил метод преобразования ключей от кода, который применяет его к вашему объекту. В этом фрагменте мы напишем обобщенную функцию c rekey
, которая принимает функцию преобразования ключей и возвращает функцию, которая принимает объект и рекурсивно запускает эту функцию над вашими клавишами.
Итак, если вы хотите чтобы преобразовать все ключи в виде змеи в ключи в верблюде, мы можем передать rekey
простую функцию преобразования на основе регулярных выражений, например:
const rekey = (fn) => (obj) =>
typeof obj == 'object'
? Object .fromEntries (
Object .entries (obj) .map (([k, v]) => [fn(k), rekey (fn) (v)])
)
: obj
const snakeToCamel = (str) =>
str .replace (/_([a-z])/g, (_, c) => c .toUpperCase ())
const obj = {home_number: '1234', customer: {name: {last_name: 'Smith'}}}
console .log (
rekey (snakeToCamel) (obj)
)
Если вы работаете в среде без Object .fromEntries
, ее легко заменить. Вы можете использовать любую из следующих версий:
// more elegant
const fromEntries = (pairs) =>
pairs .reduce ((a, [k, v]) => ({... a, [k]: v}), {})
// more memory-efficient
const fromEntries = (pairs) =>
pairs .reduce ((a, [k, v]) => {a[k] = v; return a}, {})
Но смысл этого разделения в том, что теперь это функция многократного использования, и если вы хотите изменить способ преобразования отдельных клавиш, скажем, из поиска, мы может просто передать rekey
другую функцию:
const rekey = (fn) => (obj) =>
typeof obj == 'object'
? Object .fromEntries (
Object .entries (obj) .map (([k, v]) => [fn(k), rekey(fn)(v)])
)
: obj
const newKeys = {
fed_tax_id: 'federalTaxId',
company_structure: 'companyStructure',
home_number: 'homeNumber',
customer: 'individual',
first_name: 'firstName',
last_name: 'lastName',
}
const obj = {home_number: '1234', customer: {name: {last_name: 'Smith'}}}
console .log (
rekey (key => newKeys[key] || key) (obj)
)
Конечно, с помощью этой функции карри вы можете сохранить ссылку, скажем, rekey (snakeToCamel)
и повторно использовать ее для множества различных объектов.