I can do if(user) { //do something }
but I've seen people used lodash to do simple checking. I've read lodash's docs about isEmpty
and has
methods, but can't figure out why you'd want to use these.
import { isEmpty } from 'lodash';
if(isEmpty(user)) { //omg why? }
The Lodash _. isEmpty() Method Checks if the value is an empty object, collection, map, or set. Objects are considered empty if they have no own enumerable string keyed properties. Collections are considered empty if they have a 0 length.
Return value This method returns true if the value is empty, and vice-versa. If the value is a boolean or null , it will always return true . If the value is a collection , this method will evaluate its length to determine if it's empty.
isEqual() Method. The Lodash _. isEqual() Method performs a deep comparison between two values to determine if they are equivalent. This method supports comparing arrays, array buffers, boolean, date objects, maps, numbers, objects, regex, sets, strings, symbols, and typed arrays.
keys(object) method: The required object could be passed to the Object. keys(object) method which will return the keys in the object. The length property is used to the result to check the number of keys. If the length property returns 0 keys, it means that the object is empty.
Simple and elegant function for checking the values are empty or not
function isEmpty(value) {
const type = typeof value;
if ((value !== null && type === 'object') || type === 'function') {
const props = Object.keys(value);
if (props.length === 0 || props.size === 0) {
return true;
}
}
return !value;
}
Testing the above method
It will return 'true' for all cases below
console.log(isEmtpy(null))
console.log(isEmtpy(0))
console.log(isEmtpy({}))
console.log(isEmtpy(new Set())
console.log(isEmtpy(Object.create(null))
console.log(isEmtpy(''))
console.log(isEmtpy(() => {}))
console.log(isEmtpy(() => [])
if(user)
will pass for empty Object/Array, but they are empty and should be rejected.
Also if(user)
will fail for values like 0
or false
which are totally valid values.
Using isEmpty()
will take care of such values. Also, it makes code more readable.
Point to note is isEmpty(1)
will return true
as 1
is a variable and not a datastructure and hence should return true
.
This has been stated in Docs:
Checks if value is an empty object, collection, map, or set.
Also as per docs,
Objects are considered empty if they have no own enumerable string keyed properties.
So if you have an object which does not have non-enumerable properties, its considered as empty. In the below example, foo
is a part of object o
and is accessible using o.foo
but since its non-enumerable, its considered as empty as even for..in
would ignore it.
var o = Object.create(null);
Object.defineProperty(o, "foo", {
enumerable: false,
value: "Hello World"
})
Object.defineProperty(o, "bar", {
enumerable: false,
value: "Testing 123"
});
console.log(o)
for (var k in o) {
console.log(k)
}
console.log(o.foo)
console.log(_.isEmpty(o))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Note: This does not mean you should use lodash for such purpose. You can write your own isEmpty
function.
Following is something that I use:
This will return true for following cases:
{}
, []
, ""
, undefined
, null
, object in above snippet(no enumerable property)function isEmpty(value){
return value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With