Полезная вещь - функция _.get в lodash

декабрь 9 , 2019

Решил иногда писать о небольших лайфхаках и полезных функциях, которые могут облегчить жизнь. В группе в контакте писать код неудобно, поэтому буду выкладывать на сайте.

В coffescript есть оператор ?, который проверяет переменную на null или undefined. Сам по себе оператор ? не так уж и полезен, ведь в нативном js мы часто проверяем так


    if (variable) { 
        // что-то делаем
    }

Естественно, это работает предсказуемо, если в variable не окажется пустая строка или 0.

Но самый кайф оператора ? в coffescript - в совместном применении его с оператором . (точка)
Он удобен, когда нужно вытащить поле из объекта глубокой вложенности без гарантии существования этого поля. Например


    user?.address?.street?.title

Если мы попытаемся обратиться в нативном javascript по такой цепочке, user.address.street.title, а окажется, что поля address не существует, то получим ошибку


    Uncaught TypeError: Cannot read property 'street' of undefined

А аналогичная операция в coffeescript - user?.address?.street?.title - выдаст undefined. Удобно.

Оказывается, в lodash.js есть функция _.get, которая делает то же самое. Позволяет по цепочке вытащить значение из объекта. А если хоть одного поля в цепочке нет, то не валить ошибку, а вернуть undefined. Вот примеры


    > var user = { name: 'Tom', age: 20, address: { country: 'USA', city: 'New York' } }
    
    > _.get(user, 'address.city')
    "New York"
    
    > _.get(user, 'address.street')
    undefined

Можно указать третьим параметром дефолтное значение


    > _.get(user, 'address.street', 'unknown')
    "unknown"

Если мы обратимся к несуществующему полю address -> street -> title на нативном javascript, то получим ошибку


    > user.address.street.title
    Uncaught TypeError: Cannot read property 'title' of undefined

А если через _.get - то все пройдет гладко


    > _.get(user, 'address.street.title')
    undefined

Еще одна прикольная особенность - можно обращаться не только к полям объектов, но и к массивам


    > var user = { name: 'Tom', friends: [{ name: 'Mike', age: 25 }, { name: 'Bill' }] }
    > _.get(user, 'friends[0].name')
    "Mike"
    
    > _.get(user, 'friends[1].age')
    undefined

Аналогично, если в массиве лежит объект, в котором длинная цепочка не существует, то вернется undefined без выбрасывания ошибки


    > _.get(user, 'friends[1].age.year')
    undefined

Для чего это может пригодиться? Например, когда приходится парсить огромные json-ы с непредсказуемой вложенностью и рандомным отсутствием полей отдельных объектов.

Заходите в группу в контакте - https://vk.com/webdevkin
Анонсы статей, обсуждения интернет-магазинов, vue, фронтенда, php, гита.
Истории из жизни айти и обсуждение кода.
Как Вам статья? Оцените!