Lodash - очень полезная служебная библиотека, которая позволяет нам легко работать с объектами и массивами.
Однако теперь, когда стандартная библиотека JavaScript догоняет такие библиотеки, как Lodash, мы можем реализовать многие функции простыми способами.
В этой статье мы рассмотрим, как клонировать объекты различными способами, и проведем сравнения значений объектов.
conformsTo
Lodash conformsTo
проверяет, все ли записи объекта соответствуют заданному предикату.
Мы можем проверить значение каждого свойства, чтобы увидеть, выполняется ли условие следующим образом:
const conformsTo = (obj, predicate) => { for (const [key, val] of Object.entries(obj)) { if (typeof predicate[key] === 'function' && predicate[key](val)) { return true } } return false; }
В приведенном выше коде мы использовали метод Object.entries
для получения всех записей объекта. Затем мы использовали деструктуризацию, чтобы деструктурировать записи массива, возвращаемые Object.entries
, на ключи и значения.
Затем мы сравниваем val
с функцией predicate[key]
, которая возвращает true
, если условие в ней выполнено, и false
в противном случае.
Тогда мы можем использовать его следующим образом:
const result = conformsTo({ a: 1 }, { a: x => x >= 0 });
Затем, поскольку a
имеет значение 1, он conformsTo
должен возвращать true
, потому что каждое значение, если оно больше или равно 0, поскольку predicate
имеет условие x >= 0
в качестве значения свойства a
.
eq
Объект Lodash eq
сравнивает 2 объекта, чтобы увидеть, эквивалентны ли они, используя алгоритм SameValueZero.
Мы можем реализовать нашу собственную eq
функцию, выполняя сравнение для +0 и -0 самостоятельно и используя Object.is
для всего остального:
const eq = (a, b) => { if (a === +0 && b === -0 || a === -0 && b === +0 || a === 0 && b === -0 || a === 0 && b === +0 || a === +0 && b === 0 || a === -0 && b === 0) { return true; } return Object.is(a, b); }
В приведенном выше коде мы сравнили значения 0 с разными знаками и вернули true
для всех из них.
Затем мы используем объект Object.is
для всех остальных сравнений. Когда мы называем это следующим образом:
const result = eq(1, -0);
Мы получаем, что result
это false
, и если мы назовем его следующим образом:
const result = eq(+0, -0);
мы получаем, что result
это true
.
gt
Метод Lodash gt
возвращает логическое значение, указывающее, больше ли одно число другого.
Мы можем просто использовать оператор ›, чтобы провести сравнение самостоятельно. Мы можем реализовать это следующим образом:
const gt = (a, b) => a > b;
Тогда мы можем назвать это следующим образом:
const result = gt(2, 1);
result
is true
.
gte
Как и gt
, мы можем реализовать метод Lodash gte
с оператором >=
.
Мы можем написать следующую функцию следующим образом:
const gt = (a, b) => a >= b;
Затем, когда мы напишем следующий код:
const result = gt(2, 2);
Получаем, что result
это true
.
isArray
Метод Lodash isArray
проверяет, является ли значение массивом. Мы можем просто использовать метод Array.isArray
, чтобы проверить, является ли объект массивом.
Следовательно, мы можем написать следующий код для реализации нашего собственного isArray
метода:
const isArray = arr => Array.isArray(arr);
В приведенном выше коде мы просто вызвали Array.isArray
, чтобы проверить, является ли arr
массивом.
Тогда мы можем назвать это следующим образом:
const result = isArray([1, 2, 3]);
Получаем, что result
это true
.
isDate
Метод Lodash isDate
проверяет, является ли объект экземпляром конструктора Date
.
Мы можем использовать свойство constructor.name
объекта, чтобы проверить, из какого конструктора создан объект.
Следовательно, мы можем написать следующее для реализации нашей собственной isDate
функции:
const isDate = date => date.constructor.name == 'Date'
Затем мы можем вызвать функцию следующим образом:
const result = isDate(1);
и получите, что result
это false
. Если мы назовем это так:
const result = isDate(new Date());
Получаем, что result
это true
.
Заключение
Мы можем использовать свойство constuctor.name
, чтобы получить имя конструктора, из которого создается объект.
Чтобы проверить, является ли объект массивом, мы можем использовать метод Array.isArray
для его реализации.
Чтобы сравнить значения на равенство, мы можем использовать ===
и Object.is
. Наконец, мы можем использовать >
и >=
, чтобы проверить, не больше ли что-то другого.