Search code examples
javascriptunderscore.jslodash

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,
}

Solution

  • 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)