С выпуском ES6 и более поздними версиями JavaScript появилось множество методов, расширяющих функциональность языка. Например, появились новые методы массивов и строк, а также такие полезные операторы, как spread
и rest
.
Однако такие служебные библиотеки, как Lodash, продолжают оставаться актуальными, так как содержат множество полезных методов, всё ещё не доступных в JavaScript из коробки.
В этой статье мы рассмотрим несколько методов из Lodash, которые по-прежнему делают разработку проще, чем чистый JavaScript: times
, get
, set
, debounce
, deburr
и keyBy
.
Метод times
позволяет вызвать функцию несколько раз, помещает результат вызова каждой функции в массив и возвращает массив.
Метод принимает два аргумента: количество вызовов функции и саму функцию для вызова. Например:
import * as _ from "lodash";
const getRandomInteger = () => Math.round(Math.random() * 100);
let result = _.times(5, getRandomInteger);
console.log(result);
Результат:
[16, 83, 35, 87, 41]Метод debounce
используется для того, чтобы отложить вызов функции на определённое время. В JavaScript не существует простого способа сделать это.
Метод полезен для обработки событий, если мы хотим подождать, пока выполнится что-то, а затем вызвать функцию. Например, при поиске с ввода клавиатуры debounce будет ждать, пока пользователь закончит ввод, прежде чем вызвать API, удаляя ненужные обращения к серверу.
Например, учтём численный ввод:
<input type="number" />Пишем следующий JavaScript код:
import * as _ from "lodash";
const checkPositiveNumber = e => {
console.log(+e.target.value > 0);
};
const numInput = document.querySelector("input[type=number]");
numInput.addEventListener("input", _.debounce(checkPositiveNumber, 600));
Он содержит функцию checkPositiveNumber
, которая проверяет, является ли введённое значение положительным. Затем используем метод debounce
, который принимает в качестве значений функцию и задержку вызова в миллисекундах.
Функция, которую возвращает debouce
, имеет те же параметры, что и исходная функция, за исключением того, что её вызов задерживается на указанное время.
Метод get
позволяет нам безопасным способом получить доступ к свойствам объекта. Даже если путь к свойствам не существует, метод вернёт undefined
или значение по умолчанию вместо сбоя программы.
Например, дан следующий объект:
const obj = {
foo: {
bar: { baz: { a: 3 } },
foo: { b: 2 },
baz: [1, 2, 3]
}
};
Доступ к свойствам obj
можно получить следующим образом:
Первый аргумент — это объект, к значению свойства которого мы хотим получить доступ. Второй — это путь к свойству. Последний аргумент — значение по умолчанию. Получим 3 в качестве result
.
В то же время, если путь не существует или undefined
, мы получим undefined
или значение по умолчанию. Например, если у нас есть:
Мы получим 1 в result
. Если мы не зададим значение по умолчанию:
Получим undefined
. Не существует способа безопасно получить значение глубоко вложенного свойства, пока оператор опциональной последовательности не станет основным.
Метод set
нужен, чтобы задать значение свойству объекта. Например, дан тот же объект, что мы использовали выше:
const obj = {
foo: {
bar: { baz: { a: 3 } },
foo: { b: 2 },
baz: [1, 2, 3]
}
};
Задать значение свойства можно, написав:
_.set(obj, "foo.bar.a", 1);Объект obj
изменён. Как видим, метод может задавать значения для свойств, которые до этого не существовали. У исходного объекта не было foo.bar.a
, он автоматически добавился после того, как было задано значение 1.
Получаем:
{
"foo": {
"bar": {
"baz": {
"a": 3
},
"a": 1
},
"foo": {
"b": 2
},
"baz": [
1,
2,
3
]
}
}
Это работает, даже если вложенный объект не существует. Напишем:
_.set(obj, "foo.foofoo.bar.a.b", 1);Получим:
{
"foo": {
"bar": {
"baz": {
"a": 3
}
},
"foo": {
"b": 2
},
"baz": [
1,
2,
3
],
"foofoo": {
"bar": {
"a": {
"b": 1
}
}
}
}
}
Чтобы удалить надстрочные знаки у символов строки, используем метод deburr
. Он принимает строку и возвращает новую, где символы с надстрочными знаками заменены на символы без них.
Например, строка “S’il vous plaît”
:
Превращается в "S’il vous plait"
. У ‘i’ больше нет надстрочного знака.
Метод keyBy
принимает массив и имя свойства и возвращает объект со значением свойства в качестве ключей объекта. Например, у нас есть следующий массив:
const people = [
{ name: "Joe", age: 20 },
{ name: "Jane", age: 18 },
{ name: "Mary", age: 20 }
];
Используем keyBy
:
Тогда results
будет следующим:
{
"Joe": {
"name": "Joe",
"age": 20
},
"Jane": {
"name": "Jane",
"age": 18
},
"Mary": {
"name": "Mary",
"age": 20
}
}
Затем получим объект с именем 'Joe'
, написав:
В чистом JavaScript нет простого способа сделать это без написания нескольких строк кода.
В Lodash есть множество полезных функций, простых аналогов которым нет в чистом JavaScript.
Метод times
для многократного вызова функции в одной строке; debounce
для возврата новой функции с той же сигнатурой и кодом, что у исходной, но вызов которой отложен на заданное в миллисекундах время.
Для безопасного доступа и установки значений свойств есть методы get
и set
, не вызывающие сбоя при попытке доступа к несуществующему пути свойства или возвращающие значение undefined
. Также существует метод deburr
для замены символов с надстрочными знаками символами без знаков.
И, наконец, метод keyBy
для преобразования массива в объект, который содержит значение заданного свойства каждой записи в качестве ключей и запись со значением имени заданного свойства в качестве значения.
Перевод статьи John Au-Yeung: Why is Lodash Still Useful?
Комментарии