Полезная вещь - функция _.get в lodash
Решил иногда писать о небольших лайфхаках и полезных функциях, которые могут облегчить жизнь. В группе в контакте писать код неудобно, поэтому буду выкладывать на сайте.
В 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-ы с непредсказуемой вложенностью и рандомным отсутствием полей отдельных объектов.
Истории из жизни айти и обсуждение кода.