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. Наконец, мы можем использовать > и >=, чтобы проверить, не больше ли что-то другого.