Lodash для JavaScript (Node.js): полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Lodash и зачем она нужна?

Lodash — это одна из самых популярных и мощных библиотек-утилит для JavaScript. Она предоставляет сотни готовых функций для работы с массивами, объектами, строками, числами и функциями. Lodash решает множество типичных задач, с которыми сталкивается каждый разработчик: глубокое копирование объектов, объединение данных, сортировка, фильтрация, группировка и многое другое.

Основная цель Lodash — сделать код более читаемым, предсказуемым и производительным. Вместо того чтобы писать сложные вложенные циклы и условия, вы используете одну лаконичную функцию. Это особенно важно в Node.js, где код часто работает с большими объемами данных и асинхронными операциями.

Несмотря на то, что современный JavaScript (ES6+) добавил много нативных методов (например, Array.map(), Array.filter(), Object.assign()), Lodash остается актуальным по нескольким причинам:

  • Глубокие операции: Нативные методы работают только на верхнем уровне. Lodash умеет работать с вложенными структурами (глубокое клонирование, глубокое слияние).
  • Стабильность и предсказуемость: Lodash гарантирует одинаковое поведение во всех средах (браузер, Node.js).
  • Цепочки вызовов: Уникальная возможность объединять методы в цепочки для сложной обработки данных.
  • Оптимизация: Lodash часто работает быстрее, чем написанные вручную аналоги, особенно на больших массивах.

Установка Lodash

Для установки Lodash в проекте Node.js используется менеджер пакетов npm (Node Package Manager). Убедитесь, что у вас установлен Node.js и npm.

Откройте терминал в корневой папке вашего проекта и выполните команду:

npm install lodash

После установки в вашем проекте появится папка node_modules/lodash, а в файле package.json добавится зависимость. Теперь вы можете импортировать библиотеку в свой код.

Существует два основных способа импорта:

// Импорт всей библиотеки (рекомендуется для простоты)
const _ = require('lodash');

// Импорт отдельных методов для оптимизации размера бандла
const cloneDeep = require('lodash/cloneDeep');
const merge = require('lodash/merge');

В этой статье мы будем использовать первый способ (const _ = require('lodash')), так как он наиболее нагляден для обучения.

Быстрый старт: первый пример с Lodash

Давайте напишем простой скрипт, который демонстрирует базовую мощь Lodash. Мы создадим массив объектов и выполним несколько операций: найдем уникальные значения, отсортируем и сгруппируем данные.

// quickstart.js
const _ = require('lodash');

// Исходные данные: список пользователей
const users = [
    { 'user': 'barney', 'age': 36, 'active': true },
    { 'user': 'fred', 'age': 40, 'active': false },
    { 'user': 'pebbles', 'age': 1, 'active': true },
    { 'user': 'barney', 'age': 36, 'active': false } // дубликат
];

// 1. Удаляем дубликаты по полю 'user' (оставляем первое вхождение)
const uniqueUsers = _.uniqBy(users, 'user');
console.log('Уникальные пользователи:', uniqueUsers);

// 2. Фильтруем: оставляем только активных пользователей
const activeUsers = _.filter(uniqueUsers, { 'active': true });
console.log('Активные пользователи:', activeUsers);

// 3. Сортируем по возрасту (по возрастанию)
const sortedUsers = _.sortBy(activeUsers, ['age']);
console.log('Отсортированные активные пользователи:', sortedUsers);

// 4. Группируем по возрасту
const groupedByAge = _.groupBy(users, 'age');
console.log('Пользователи, сгруппированные по возрасту:', groupedByAge);

Запустите этот скрипт командой node quickstart.js. Вы увидите, как Lodash всего в несколько строк кода решил задачи, которые потребовали бы десятков строк на чистом JavaScript.

Основные методы и функции Lodash

Lodash содержит более 300 функций. Мы рассмотрим 10 самых полезных и часто используемых, разбив их на категории.

1. _.chunk(array, [size=1]) — Разбиение массива на части

Что делает: Создает массив элементов, разбитых на группы по size элементов. Если массив не может быть разделен равномерно, последняя группа будет содержать оставшиеся элементы.

Параметры:

  • array (Array): Массив для обработки.
  • [size=1] (number): Длина каждой группы.

Возвращает: (Array): Новый массив, состоящий из групп.

const _ = require('lodash');

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

// Разбиваем на группы по 3 элемента
const chunked = _.chunk(numbers, 3);
console.log(chunked); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

// Разбиваем на группы по 4 элемента (последняя группа будет неполной)
const chunked2 = _.chunk(numbers, 4);
console.log(chunked2); // [[1, 2, 3, 4], [5, 6, 7, 8], [9]]

2. _.compact(array) — Удаление "ложных" значений

Что делает: Создает массив, из которого удалены все "ложные" (falsy) значения. К ним относятся: false, null, 0, "", undefined, NaN.

Параметры:

  • array (Array): Массив для очистки.

Возвращает: (Array): Новый массив без "ложных" значений.

const _ = require('lodash');

const messyArray = [0, 1, false, 2, '', 3, null, undefined, 4, NaN];
const cleanArray = _.compact(messyArray);
console.log(cleanArray); // [1, 2, 3, 4]

3. _.concat(array, [values]) — Объединение массивов

Что делает: Создает новый массив, объединяя исходный массив с любыми дополнительными массивами и/или значениями.

Параметры:

  • array (Array): Исходный массив.
  • [values] (...*): Значения или массивы для добавления.

Возвращает: (Array): Новый объединенный массив.

const _ = require('lodash');

const array1 = [1, 2];
const array2 = [3, 4];
const value = 5;

const result = _.concat(array1, array2, value);
console.log(result); // [1, 2, 3, 4, 5]

// Работает и с вложенными массивами (но не разворачивает их глубоко)
const nested = _.concat([1], [[2]], [3]);
console.log(nested); // [1, [2], 3]

4. _.difference(array, [values]) — Разность массивов

Что делает: Создает массив из тех элементов первого массива, которые не присутствуют во втором (или последующих) массивах. Сравнение производится с помощью строгого равенства (===).

Параметры:

  • array (Array): Исходный массив.
  • [values] (...Array): Массивы, значения которых нужно исключить.

Возвращает: (Array): Массив с уникальными элементами из первого массива.

const _ = require('lodash');

const base = [1, 2, 3, 4, 5];
const toExclude = [2, 4, 6];

const diff = _.difference(base, toExclude);
console.log(diff); // [1, 3, 5]

5. _.flattenDeep(array) — Полное "выпрямление" вложенных массивов

Что делает: Рекурсивно "выпрямляет" вложенный массив в одноуровневый. В отличие от _.flatten() (который работает только с одним уровнем вложенности), _.flattenDeep() работает с любым уровнем глубины.

Параметры:

  • array (Array): Вложенный массив.

Возвращает: (Array): Новый одноуровневый массив.

const _ = require('lodash');

const deeplyNested = [1, [2, [3, [4, [5]]]]];
const flat = _.flattenDeep(deeplyNested);
console.log(flat); // [1, 2, 3, 4, 5]

// Сравнение с обычным flatten
const oneLevel = _.flatten([1, [2, [3]]]);
console.log(oneLevel); // [1, 2, [3]]

6. _.merge(object, [sources]) — Глубокое слияние объектов

Что делает: Рекурсивно объединяет свойства двух или более объектов. Если свойство существует в обоих объектах и является объектом, оно объединяется рекурсивно. В отличие от Object.assign(), который просто заменяет значения.

Параметры:

  • object (Object): Целевой объект.
  • [sources] (...Object): Исходные объекты для слияния.

Возвращает: (Object): Измененный целевой объект.

const _ = require('lodash');

const defaultConfig = {
    server: { host: 'localhost', port: 3000 },
    logging: { level: 'info', file: 'app.log' }
};

const userConfig = {
    server: { port: 8080 }, // переопределяем порт
    logging: { level: 'debug' } // переопределяем уровень
};

const finalConfig = _.merge({}, defaultConfig, userConfig);
console.log(finalConfig);
// {
//   server: { host: 'localhost', port: 8080 },
//   logging: { level: 'debug', file: 'app.log' }
// }
// Обратите внимание: host и file не были потеряны!

7. _.cloneDeep(value) — Глубокое копирование

Что делает: Создает глубокую копию переданного значения. Это означает, что все вложенные объекты и массивы также копируются, а не ссылаются на исходные. Это критически важно для избежания побочных эффектов при работе с объектами.

Параметры:

  • value (*): Значение для копирования.

Возвращает: (*): Глубокая копия значения.

const _ = require('lodash');

const original = {
    name: 'John',
    address: { city: 'New York', zip: 10001 },
    hobbies: ['reading', 'coding']
};

const deepCopy = _.cloneDeep(original);

// Изменяем копию
deepCopy.address.city = 'Los Angeles';
deepCopy.hobbies.push('gaming');

console.log('Оригинал:', original);
// { name: 'John', address: { city: 'New York', zip: 10001 }, hobbies: ['reading', 'coding'] }
console.log('Копия:', deepCopy);
// { name: 'John', address: { city: 'Los Angeles', zip: 10001 }, hobbies: ['reading', 'coding', 'gaming'] }
// Оригинал остался нетронутым!

Рекомендаций