lodash: как проверить, является ли объект пустым
У меня есть объект:
{"": undefined}
И когда я проверяю этот объект на пустоту с помощью следующего кода:
_.isEmpty({"": undefined})
Я получаю результат false
. Возможно, в lodash есть другой метод для проверки пустоты объекта? Как правильно определить, является ли этот объект пустым?
5 ответ(ов)
В вашем случае это нельзя назвать пустым объектом (Object.values(obj).length
вернёт 1), но для совершенно пустого объекта можно использовать следующий способ:
import { matches } from 'lodash';
matches(obj, {});
Такой подход позволяет проверить, что объект действительно пустой, сравнивая его с пустым объектом.
Я бы сделал это следующим образом:
_.isEmpty(_.omitBy(object_to_check, _.isNil));
В этом примере _.omitBy
удаляет все ключи с значениями null
и undefined
. Если нужно удалить только undefined
, можно использовать _.isUndefined
вместо _.isNil
.
Функция _.isEmpty(obj)
из библиотеки Lodash проверяет, является ли объект пустым. Однако важно понимать, что объект считается непустым, если в нем есть свойства, даже если они имеют значение undefined
.
В вашем примере:
var obj = {
'firstName': undefined,
'lastName': undefined
};
console.log(_.isEmpty(obj)); // false
console.log(_.isEmpty({})); // true
Вывод false
для obj
объясняется тем, что в объекте все еще содержатся ключи 'firstName'
и 'lastName'
, даже если их значения равны undefined
. Таким образом, _.isEmpty
возвращает false
, поскольку у объекта есть свойства.
Если вы хотите проверить, пуст ли объект в значении (то есть, если все его свойства равны undefined
или отсутствуют), вам нужно будет написать собственную функцию проверки или использовать метод, который будет учитывать значения свойств.
Вот пример функции, которая проверяет, все ли свойства равны undefined
:
function isObjectTrulyEmpty(obj) {
for (var key in obj) {
if (obj.hasOwnProperty(key) && obj[key] !== undefined) {
return false; // Найдено свойство с определенным значением
}
}
return true; // Все свойства равны undefined или отсутствуют
}
console.log(isObjectTrulyEmpty(obj)); // true
Таким образом, данная функция будет возвращать true
для объекта obj
и false
для непустых объектов с другими значениями.
Дополнительную информацию о способах проверки, пуст ли объект, вы можете найти в статье на сайте Eric Feminella.
Ваш пример объекта *не является пустым, поэтому, возможно, вам следует проверить, что все его свойства определены как undefined:
let o = {foo: undefined};
!_.values(o).some(x => x !== undefined); // true
В этом коде мы используем метод _.values
из библиотеки Lodash, чтобы получить массив значений объекта o
, а затем проверяем, что ни одно из значений не является определенным (не равно undefined
). Если все свойства равны undefined
, то выражение вернет true
.
Конечно! Вот перевод вашего кода с объяснением на русском, в стиле ответа на вопрос на StackOverflow.com:
Это, конечно, может быть несколько избыточным, но вот решение, которое я использую для рекурсивной проверки на наличие пустых объектов, с использованием библиотеки lodash
.
function checkEmptyObject(obj) {
// Проверяем, является ли объект пустым
if (_.isEmpty(obj)) return true;
// Проверяем все свойства объекта
return _.isEmpty(
Object.entries(obj)
.map(([key, value]) => {
// Если значение пустое, возвращаем true
if (_.isEmpty(value)) return true;
// Если значение - это объект, рекурсивно проверяем его
if (value instanceof Object) return checkEmptyObject(value);
// Если не пустое, возвращаем false
return false;
})
// Фильтруем результаты, оставляя только 'false'
.filter((b) => b === false)
);
}
Данная функция checkEmptyObject
принимает объект и проверяет, является ли он пустым или содержит только пустые вложенные объекты. Сначала проверяется, является ли сам объект пустым с помощью _.isEmpty()
. Если нет, то далее перебираются все его свойства.
Каждое свойство проверяется, и если его значение также пустое, возвращается true
. Если значение — это объект, функция recursively вызывает себя для дальнейшей проверки. Если ни одно из значений не является пустым, возвращается false
.
Надеюсь, это поможет вам решить вашу задачу! Если есть вопросы, не стесняйтесь задавать.
Как остановить цикл _.each в lodash.js?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"