Полезные функции в lodash

Постоянно пользуюсь разными функциями из lodash. Уже писал о том как отсортировать объект по ключам. Сегодня напишу еще несколько примеров полезных функций из lodash.

Безопасное получение вложенного значения

Часто бывает так что у вас есть сложная структура данных:

var struct = {  
  clients: [{
    user: {
      name: 'John'
    }
  }]
};

Теперь чтобы получить значение свойства name придется написать чудовищную конструкцию:

if (struct && struct.clients && struct.clients.length > 0 && struct.clients[0].user) {  
  name = struct.clients[0].user.name;
}

С _.get это намного проще:

name = _.get(struct, 'clients[0].user.name');

// можно задать значение по умолчанию
name = _.get(struct, 'clients[1].user.name', 'Guest');

// и set тоже работает!
_.set(struct, 'clients[1].user.name', 'Bob');  

Применение методов коллекций к объектам

В JavaScript у массивов есть такие удобные и полезные функции как map, filter, forEach и другие. Но к сожалению их нельзя использовать с объектами. С lodash это возможно:

var user = {  
  firstName: 'John',
  lastName: 'Do',
};

_.forEach(user, (value) => {  
  console.log(value);
})

Компактный map

Если нужно достать какое-нибудь вложенное свойство у объектов в коллекции, то вместо полноценного кэллбека можно использовать синтаксис из примера с _.get:

var clients = _.map(struct.clients, 'user.name');  

Удобный фильтр

Очень часто приходится фильтровать объекты в списке, с _.filter это очень удобно:

var clients = [{  
  user: 'John',
}, {
  user: 'Bob',
}];

// отфильтрует всех пользователей у которых user равен John
var johns = _.filter(clients, {user: 'John'});

// find работает также, только возвращает первое совпадение
var jhon = _.find(clients, {'user': 'John'});  

Копирование объектов

Получить полную копию объекта в JavaScript не так то просто. Часто это делают через сериализацию JSON.parse(JSON.stringify(struct)). В lodash можно использовать _.cloneDeep:

var copyStruct = _.cloneDeep(struct);  

Получение случайного значения

В JavaScript Math.random возвращает дробное число до единицы. Это не очень удобно когда вам нужно получить целое число в заданном диапазоне. В lodash для этого есть готовый метод random:

var number = _.random(5, 10);  

А что если нужно выбрать случайный элемент из массива? Для это есть метод sample:

var items = ['a', 'b', 'c'];

// получить один случайный элемент из массива
var value = _.sample(items);

// получить два случайных элемента из массива
var randomValues = _.sample(items, 2);  

Это далеко не полный список полезных функций из lodash.