Luca Reghellin
Luca Reghellin

Reputation: 8125

How to check if and object is empty (deep)?

Take this:

var lists:{
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
}

Since it's substantially empty, I want a function (maybe but not necessarily a _lodash one) that checks it and say that is empty.

Something like

is_empty(lists) // >> true (because every property resolves to an empty object)

How to?

Upvotes: 0

Views: 3170

Answers (3)

Aamir Iqubal
Aamir Iqubal

Reputation: 327

This solution with check for the emptyness of the eternally nested object. Note: This will treat empty string '' and boolean false as empty as well. If you need special support for stings then may be you can do some tweaking in the below code.

const isDeeplyEmpty = item => {
  if(typeof item === 'boolean') return !item;
  else if(typeof item === 'number') return false;
  else if(typeof item === 'object') {
    return Object.keys(item).every(k => {
      if(['object', 'boolean', 'number'].includes(typeof item[k])) {
        return isDeeplyEmpty(item[k]);
      }
      return _.isEmpty(item[k]);
    })
  }
  return !item;
};

Upvotes: 0

Leonid Pyrlia
Leonid Pyrlia

Reputation: 1712

You can iterate over the values of the object and check if all of them are empty:

var lists = {
  item1:{},
  item2:{},
  item3:{},
  item4:{}
}

//ES6:
function isEmpty(obj) {
    return Object.keys(obj).every(k => !Object.keys(obj[k]).length)
}

console.log(isEmpty(lists));

// ES5
function isEmpty(obj) {
    return Object.keys(obj).every(function(k) {
        return !Object.keys(obj[k]).length}
    )
}

console.log(isEmpty(lists));

Upvotes: 4

CertainPerformance
CertainPerformance

Reputation: 371233

If lists is always an object of objects, you can iterate over all values with Object.values and check that each value (inner object) has no keys:

const isEmpty = outer => Object.values(outer).every(
  inner => Object.keys(inner).length === 0
);

var lists = {
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
}
var lists2 = {
  item1:{}
  ,item2:{}
  ,item3:{}
  ,item4:{}
  ,item5:{ foo: 'bar' }
}
console.log(isEmpty(lists));
console.log(isEmpty(lists2));

Upvotes: 2

Related Questions