[JavaScript] Конец вечного противостояния snake_keys VS camelKeys: наводим порядок в стилях написания переменных 
    
    
        
    
    
    
    
            
    
        
            
                
                                    
                
                                    
                
                    
                
            
        
    
    
        
            
                
                
                    
                           
                    
                        Автор 
                        Сообщение 
                    
                                        
                        
                            
                                
                                
                                                                                                            news_bot ®
                                                                        
                                                                                                                                                
                                                                            
                                                                                                                
                                            Стаж: 7 лет 8 месяцев                                        
                                                                                                                
                                            Сообщений: 27286                                        
                                                                                                                                                
                                                             
                            
                                
                             
                         
                        
                            
                                
                                    
                                        
                                        
 Привет, Хабр! Меня зовут Владимир, работаю в Ozon, занимаюсь фронтендом.   Сегодня мы поговорим о строительстве мостов взаимопонимания между фронтендом и бэкендом – в той части, которая связана со стилем написания переменных. Представим ситуацию: начинается работа над сайтом, разработчики тёмной и светлой сторон встречаются обсудить насущные вопросы. Один из таких вопросов связан с передачей данных. Бекенд отдает и принимает данные в виде: 
{
    user_name: "user1",
    main_title: "Title",
}
Фронтенд:
{
    userName: "user1",
    mainTitle: "Title",
}
В итоге выбор стиля написания переменных может привести к горячему спору, а иногда и к небольшой потасовке.В этой статье мы попробуем решить эту проблему – преобразовать все данные бэкенда в данные фронтенда и наоборот. Воспользуемся для этого JavaScript. Надеюсь, статья будет полезна начинающим разработчикам, а остальным лишний раз напомнит о знакомых приёмах по добавлению комфорта в разработку. Шаг 1. Преобразование строки Нам поможет встроенная функция replace. Она умеет заменять каждое вхождение заданного регулярного выражения с помощью функции маппера, которую мы передаём вторым аргументом. # Преобразование snake_keys строки в camelKeys: 
const snakeToCamel = str => {
    return str.replace(/([_][a-z])/g, letter => {
        return letter
                .toUpperCase()
                .replace('_', '')
    })
}
# Преобразование camelKeys строки в snake_keys: 
const camelToSnake = str => {
    return str.replace(/[A-Z]/g, letter => {
        return '_' + letter.toLowerCase()
    })
}
Шаг 2. Работа с объектами 
# Возьмем пример с начала статьи
{
    user_name: "user1",
    main_title: "Title",
}
Пройдёмся по ключам объекта и заменим их с помощью уже реализованной функции snakeToCamel. 
const simpleKeysTransform = value => { 
    return Object.entries(value).reduce((acc, [key, value]) => { 
        const newKey = snakeToCamel(key) 
        return {...acc, [newKey]: value} 
    }, {}) 
} 
Давайте теперь сделаем универсальную функцию преобразования и будем принимать на вход ещё переменную, отвечающую за изначальный вид стиля ключей объекта.
const keysTransform1 = (value, isInitialSnake = true) => {
    const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake
    return Object.entries(value).reduce((acc, [key, value]) => {
        const newKey = chooseStyle(key)
        return {...acc, [newKey]: value}
    }, {})
}
Шаг 3. Что делать с вложенными объектами 
# Например
{
  user_info: {
    first_name: "User",
    last_name: "Userin”
  }
}
Применим рекурсию. Обернём основную логику в функцию и в ней будем проверять: является ли наше значение объектом. Если да, то будем вызывать нашу функцию снова и снова. 
const keysTransform2 = (input, isInitialSnake = true) => {
    const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake
    const recursiveTransform = value => {
        if (value && typeof value === 'object') {
            return Object.entries(value).reduce((acc, [key, value]) => {
                const newKey = chooseStyle(key)
                const newValue = recursiveTransform(value)
                return {...acc, [newKey]: newValue}
            }, {})
        }
        return value
    }
    return recursiveTransform(input)
}
Шаг 4. Что делать с массивами 
# Например
{
  users: [
    {
      first_name: "user1",
      phone_number: 8996923
    },
    {
      first_name: "user2",
      phone_number: 12312312
    }
  ]
}
Всё до безобразия просто. Добавим проверку на массив и на каждый его элемент навесим нашу рекурсивную функцию. 
const keysTransform = (input, isInitialSnake = true) => {
    const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake
    const recursiveTransform = value => {
        if (Array.isArray(value)) {
            return value.map(recursiveTransform)
        }
        if (value && typeof value === 'object') {
            return Object.entries(value).reduce((acc, [key, value]) => {
                const newKey = chooseStyle(key)
                const newValue = recursiveTransform(value)
                return {...acc, [newKey]: newValue}
            }, {})
        }
        return value
    }
    return recursiveTransform(input)
}
Перемирие Давайте посмотрим, что получилось: мы реализовали алгоритм преобразования ключей объектов из snake_keys в camelKeys и наоборот. Чуть-чуть меньше раздора между фронтендом и бэкендом – неплохо же! Существуют и другие стили написания составных слов (PascalKeys, kebab-keys, UPPER_SNAKE_KEYS). При надобности, вы уже сами сможете с ними справиться. 
===========
 Источник:
habr.com
===========
Похожие новости:
- [Программирование, Angular] Простая архитектура приложений на фреймворке Angular (перевод)
 
- [JavaScript, Видеоконференцсвязь] Видеоконференции — как бороться с высокой загрузкой ЦПУ?
 
- [Веб-дизайн, JavaScript, jQuery, HTML] EasyUI: действительно easy?
 
- [JavaScript, Расширения для браузеров, Медийная реклама] AdBlock: особенности работы и продвинутые методы блокировки
 
- [JavaScript, Программирование, Алгоритмы, Функциональное программирование] Решаем вопрос сортировки в JavaScript раз и навсегда
 
- [JavaScript, API, Тестирование веб-сервисов] Настраиваем нагрузочное тестирование с Artillery.io
 
- [Разработка веб-сайтов, Python, JavaScript, Программирование] Как создавать предметы генеративного искусства с помощью L-систем на языке Python (перевод)
 
- [Высокая производительность, Java, Анализ и проектирование систем, Алгоритмы] Развеиваем мифы об управлении памятью в JVM (перевод)
 
- [Angular] Как быстро и удобно документировать Angular проект с помощью модуля AddOnDoc из TaigaUI
 
- [JavaScript, Программирование] Функции: эта ошибка дороже, чем «null» (перевод)
Теги для поиска: #_javascript, #_frontend, #_frontend (фронтенд), #_backend, #_bekend (бекенд), #_patterny_proektirovanija (паттерны проектирования), #_nikto_ne_chitaet_tegi (никто не читает теги), #_blog_kompanii_ozon_tech (
Блог компании Ozon Tech
), #_javascript
                                        
                                        
                                        
                                     
                                    
                                    
                                                                    
                                                                                             
                         
                        
                            
                                                                    
                                                             
                         
                    
                    
                
                
            
        
    
    
    
    
    
            
    
            
    
        
    
    
        
                        Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
    
    
        
        Текущее время: 31-Окт 05:03
Часовой пояс: UTC + 5 
            
    
                
| Автор | Сообщение | 
|---|---|
| news_bot ® 
                                                                            
                                                                                                                
                                            Стаж: 7 лет 8 месяцев                                         | |
| Привет, Хабр! Меня зовут Владимир, работаю в Ozon, занимаюсь фронтендом. Сегодня мы поговорим о строительстве мостов взаимопонимания между фронтендом и бэкендом – в той части, которая связана со стилем написания переменных. Представим ситуацию: начинается работа над сайтом, разработчики тёмной и светлой сторон встречаются обсудить насущные вопросы. Один из таких вопросов связан с передачей данных. Бекенд отдает и принимает данные в виде: { user_name: "user1", main_title: "Title", } { userName: "user1", mainTitle: "Title", } const snakeToCamel = str => { return str.replace(/([_][a-z])/g, letter => { return letter .toUpperCase() .replace('_', '') }) } const camelToSnake = str => { return str.replace(/[A-Z]/g, letter => { return '_' + letter.toLowerCase() }) } # Возьмем пример с начала статьи { user_name: "user1", main_title: "Title", } const simpleKeysTransform = value => {  return Object.entries(value).reduce((acc, [key, value]) => { const newKey = snakeToCamel(key) return {...acc, [newKey]: value} }, {}) } const keysTransform1 = (value, isInitialSnake = true) => { const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake return Object.entries(value).reduce((acc, [key, value]) => { const newKey = chooseStyle(key) return {...acc, [newKey]: value} }, {}) } # Например { user_info: { first_name: "User", last_name: "Userin” } } const keysTransform2 = (input, isInitialSnake = true) => { const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake const recursiveTransform = value => { if (value && typeof value === 'object') { return Object.entries(value).reduce((acc, [key, value]) => { const newKey = chooseStyle(key) const newValue = recursiveTransform(value) return {...acc, [newKey]: newValue} }, {}) } return value } return recursiveTransform(input) } # Например { users: [ { first_name: "user1", phone_number: 8996923 }, { first_name: "user2", phone_number: 12312312 } ] } const keysTransform = (input, isInitialSnake = true) => { const chooseStyle = isInitialSnake ? snakeToCamel : camelToSnake const recursiveTransform = value => { if (Array.isArray(value)) { return value.map(recursiveTransform) } if (value && typeof value === 'object') { return Object.entries(value).reduce((acc, [key, value]) => { const newKey = chooseStyle(key) const newValue = recursiveTransform(value) return {...acc, [newKey]: newValue} }, {}) } return value } return recursiveTransform(input) } =========== Источник: habr.com =========== Похожие новости: 
 Блог компании Ozon Tech ), #_javascript | |
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
    Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 31-Окт 05:03
Часовой пояс: UTC + 5 
