Tib
Tib

Reputation: 2631

Lodash filter by object of object

How to filter items by type?

const items = {
        'someHash0': {
          type: 'foo',
          name: 'a'
        },
        'someHash1': {
          type: 'foo',
          name: 'b'
        },
        'someHash2': {
          type: 'foo',
          name: 'c'
        },
        'someHash3': {
          type: 'baz',
          name: 'd'
        },
      };

I want to filter by type=foo and get that result:

const items = {
        'someHash0': {
          type: 'foo',
          name: 'a'
        },
        'someHash1': {
          type: 'foo',
          name: 'b'
        },
        'someHash2': {
          type: 'foo',
          name: 'c'
        }
      };

I tryied with

 return _.mapValues(pairs, function (item) {
     return (item.type === 'foo') ?? item
})

but it returns true/false instead of the whole object

Upvotes: 2

Views: 134

Answers (2)

Julien
Julien

Reputation: 852

map in general is for editing iterated inputs, so it's not what you need.

You can do like this:

let result = _.filter(items, x => x.type === 'foo')

If you need to keep the same keys you could do it like this :

let result = _.pickBy(items, x => x.type === 'foo')

Upvotes: 3

jkoestinger
jkoestinger

Reputation: 1010

A filter would be enough if you didn't need to re-add the numbering. In that case, you can still get away rather easily by combining reduce and filter, as follow:

const items = {
  '0': {
    type: 'foo',
    name: 'a'
  },
  '1': {
    type: 'foo',
    name: 'b'
  },
  '2': {
    type: 'foo',
    name: 'c'
  },
  '3': {
    type: 'baz',
    name: 'd'
  },
};

const mapped = _.reduce(_.filter(items, (item) => item.type === 'foo'), (acc, item, index) => {
  acc[index] = item
  return acc
}, {})

console.log(mapped)
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

Upvotes: 0

Related Questions