Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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, } 
like image 740
user3598395 Avatar asked Mar 26 '15 15:03

user3598395


People also ask

How do you filter the value of a object?

One can use filter() function in JavaScript to filter the object array based on attributes. The filter() function will return a new array containing all the array elements that pass the given condition. If no elements pass the condition it returns an empty array.

Can we apply filter on object?

JavaScript's Objects are not iterable like arrays or strings, so we can't make use of the filter() method directly on an Object .

How do you filter object keys?

JavaScript objects don't have a filter() method, you must first turn the object into an array to use array's filter() method. You can use the Object. keys() function to convert the object's keys into an array, and accumulate the filtered keys into a new object using the reduce() function as shown below.


1 Answers

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) 
like image 124
Retsam Avatar answered Oct 07 '22 10:10

Retsam