Filtering object properties based on value

Is there some elegant way of filtering out falsey properties from this object with lodash/underscore? Similar to how _.compact(array) removes falsey elements from arrays

so from

{
  propA: true,
  propB: true,
  propC: false,
  propD: true,
}

returning

{
  propA: true,
  propB: true,
  propD: true,
}

Answer

Lodash 4.0

Lodash 4.0 has _.pick, which takes an array of properties, and _.pickBy which takes a function as an argument and returns an object only containing the keys for which that function returns truthy which is what we want here, so it’d be:

filtered = _.pickBy(obj, function(value, key) {return value;})

Or, since _.pickBy defaults to using _.identity as it’s second argument, (and that’s essentially what we’ve written above,) it can just be written as:

filtered = _.pickBy(obj);

Underscore or Lodash prior to version 4.0

In underscore and old versions of lodash, there’s just a single _.pick, which has both behaviors of _.pick and _.pickWith from v4. So you can do:

filtered = _.pick(obj, function(value, key) {return value;})

Or more succinctly:

filtered = _.pick(obj, _.identity)

Leave a Reply

Your email address will not be published. Required fields are marked *