Search code examples
javascriptfilterlodash

lodash _.filter for conditions optionally based on arrays?


The _.filter function works great for objects containing single items as the values.

var users = [
  { 'user': 'barney', 'age': 36, 'active': true },
  { 'user': 'fred',   'age': 40, 'active': false }
];

_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']

// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']

Is there a way to apply the same function to objects with arrays as values?

I'd like to get any elements that may contain the value, including if it is one of the values of an array:

var users = [
  { 'user': 'barney', 'age': 36, 'active': true, 'colors': ['blue', 'yellow'] },
  { 'user': 'fred',   'age': 40, 'active': false, 'colors': ['blue', 'purple'] }
  { 'user': 'mary',   'age': 40, 'active': false, 'colors': ['blue', 'grey'] }
];

_.filter(users, { 'colors': 'blue' });
// => all objects as they all contain 'blue'

_.filter(users, { 'active': false , 'colors': 'blue' });
// => objects for 'fred' and 'mary'

Solution

  • Put brackets around the color you want to filter on: { 'colors': ['blue'] }

    var users = [
      { 'user': 'barney', 'age': 36, 'active': true, 'colors': ['blue', 'yellow'] },
      { 'user': 'fred',   'age': 40, 'active': false, 'colors': ['blue', 'purple'] },
      { 'user': 'mary',   'age': 40, 'active': false, 'colors': ['grey', 'blue'] }
    ];
    
    console.log(_.filter(users, { 'colors': ['blue'] }));
    console.log(_.filter(users, { 'active': false, 'colors': ['blue'] }));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>