33
votes

I have this object: {"": undefined}

and when I check this object for empty in this way: _.isEmpty({"": undefined})

I get false result, maybe in lodash we have another method?

5
Why do you think the object is empty? It has one valid key. - thefourtheye
FYI, {} is an empty object. - MForMarlon

5 Answers

21
votes

Your example object is not empty so instead perhaps you want to test if all properties are undefined

let o = {foo: undefined};
!_.values(o).some(x => x !== undefined); // true
48
votes
_.isEmpty(obj, true)

var obj = {
  'firstName': undefined
, 'lastName' : undefined
};

console.log(_.isEmpty(obj)); // false
console.log(_.isEmpty({})); // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

Please, see http://www.ericfeminella.com/blog/2012/08/18/determining-if-an-object-is-empty-with-underscore-lo-dash/

6
votes

It depends on how you want to check it. Do you want to check some or every

Then what you can do is :

import { some, isEmpty } from 'lodash'
console.log(some(this.yourObject, isEmpty))
4
votes

In your case it cannot be called an empty object (Object.values(obj).length would return 1), but for a completely empty object this can be used:

import { matches } from 'lodash';
matches(obj, {});
0
votes

I guess this is a bit overkill, but this is what I use which recursively checks for nested objects too and uses lodash.

function checkEmptyObject(obj) {
  if (_.isEmpty(obj)) return true;
  return _.isEmpty(
    Object.entries(obj)
      .map(([key, value]) => {
        if (_.isEmpty(value)) return true;
        if (value instanceof Object) return checkEmptyObject(value);
        return false;
      })
      .filter((b) => b === false)
  );
}