Use Object.keys(obj).length to check if it is empty.
Output : 3
Source: Object.keys()
Use Object.keys(obj).length to check if it is empty.
Output : 3
Source: Object.keys()
You can use Object.keys like this:
class Brand { }
const brand = new Brand();
if (Object.keys(brand).length === 0) {
console.log("No properties")
}
If you want to check if the object has at least one non-null, non-undefined property:
- Get all the values of the object in an array using
Object.values() - Check if at least one of has value using
some
const hasValues =
(obj) => Object.values(obj).some(v => v !== null && typeof v !== "undefined")
class Brand { }
const brand = new Brand();
if (hasValues(brand)) {
console.log("This won't be logged")
}
brand.name = null;
if (hasValues(brand)) {
console.log("Still no")
}
brand.name = "Nike";
if (hasValues(brand)) {
console.log("This object has some non-null, non-undefined properties")
}
Videos
I have been having fun trying to build a type to check if a TS type is empty or inhabited. Initially I thought that I could just check if the type extends never but it turns out that empty object types like {foo: never} don't extend never and similarly, empty tuple types like [string, never] also don't extend never.
So I built a type that determines if a type is empty by recusively checking the properties and handling the edge cases. I learned a lot about the subtype relations and about how conditional types work. Figuring out the distribution over unions was particularly tricky.
I'm sure I've missed some edge cases, please let me know if the comments if you find it useful/interesting or if there is something that doesn't work as expected.
Github
TS Playground
Hi everyone,
I very often find myself writing something like
if( Object.keys(someObject).length > 0 ) {
//do some wild stuff
}
To check if a basic object is empty or not i.e. not {} there must be a beautiful way.
I know lodash and jQuery have their solutions, but I don't want to import libraries for a single method, so I'm about to write a function to use across a whole project, but before I do that I want to know I'm not doing something really stupid that ES6/ES7/ES8 can do that I'm just not aware of.
edit solution courtesy of u/vestedfox
Import https://www.npmjs.com/package/lodash.isequal
Total weight added to project after compilation: 355 bytes
Steps to achieve this.
npm i --save lodash.isequal
then somewhere in your code
const isEqual = require('lodash.isequal');
If you're using VueJS and don't want to have to include this in every component and don't want to pollute your global namespace you can do this in app.js
const isEqual = require('lodash.isequal');
Vue.mixin({
methods: {
isEqual: isEqual
}
});Then in your components you can simply write.
if( this.isEqual(someObject, {})) {
console.log('This object has properties');
}You can use a forโฆin loop with an Object.hasOwn (ECMA 2022+) test to check whether an object has any own properties:
Copyfunction isEmpty(obj) {
for (const prop in obj) {
if (Object.hasOwn(obj, prop)) {
return false;
}
}
return true;
}
If you also need to distinguish {}-like empty objects from other objects with no own properties (e.g. Dates), you can do various (and unfortunately need-specific) type checks:
Copyfunction isEmptyObject(value) {
if (value == null) {
// null or undefined
return false;
}
if (typeof value !== 'object') {
// boolean, number, string, function, etc.
return false;
}
const proto = Object.getPrototypeOf(value);
// consider `Object.create(null)`, commonly used as a safe map
// before `Map` support, an empty object as well as `{}`
if (proto !== null && proto !== Object.prototype) {
return false;
}
return isEmpty(value);
}
Note that comparing against Object.prototype like in this example will fail to recognize cross-realm objects.
Do not use Object.keys(obj).length. It is O(N) complexity because it creates an array containing all the property names only to get the length of that array. Iterating over the object accomplishes the same goal but is O(1).
For compatibility with JavaScript engines that donโt support ES 2022+, const can be replaced with var and Object.hasOwn with Object.prototype.hasOwnProperty.call:
Copyfunction isEmpty(obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true
}
Many popular libraries also provide functions to check for empty objects:
jQuery:
CopyjQuery.isEmptyObject({}); // true
lodash:
Copy_.isEmpty({}); // true
Underscore:
Copy_.isEmpty({}); // true
Hoek:
CopyHoek.deepEqual({}, {}); // true
ExtJS:
CopyExt.Object.isEmpty({}); // true
AngularJS (version 1):
Copyangular.equals({}, {}); // true
Ramda:
CopyR.isEmpty({}); // true
If ECMAScript 5 support is available, you can use Object.keys():
Copyfunction isEmpty(obj) {
return Object.keys(obj).length === 0;
}
For ES3 and older, there's no easy way to do this. You'll have to loop over the properties explicitly:
Copyfunction isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}