Christian-G
Christian-G

Reputation: 2361

Filtering nested array of objects

I have the following events array. For every event there is a hash as {organisation name: [{participant 1}, {participant 2}, {...}]}

"events": [
    {
        "Org A": [
            {
                "event_id": 1,
                "id": 432,
                "name": "John Doe",
                "role": null
            },
            {
                "event_id": 1,
                "id": 312,
                "name": "Jane Mow",
                "role": [
                  "speaker"
                ]
            }
        ],
    }
],

I would like to filter this events array to only contain participants whose role contains speaker. Also, when there are no speakers in the participant array, the respective organisation entry needs to be removed from the Hash (object).

To filter the array of objects, I tried using this:

_.each(events, function(event){
  _.filter(event, function(p) { 
   _.filter(p, function(d){ 
     return _.some(d.role, function(r){ 
      return r == "speaker"}) 
    }) 
  }) 
})   

This however doesn't work.

Upvotes: 1

Views: 275

Answers (1)

Oleksandr T.
Oleksandr T.

Reputation: 77482

Try this

var data = {
    "events": [{
        "Org A": [{
            "event_id": 1,
            "id": 432,
            "name": "John Doe",
            "role": null
        }, {
            "event_id": 1,
            "id": 312,
            "name": "Jane Mow",
            "role": [
                "speaker"
            ]
        }],
        
        "Org B": [],
        "Org C": []
    }]
};

var SPEAKER = 'speaker';

var result = _.map(data.events, function (events) {
  return _.chain(events)
    .mapObject(function (value, key) {
      return _.filter(value, function (event) {
        return _.isArray(event.role) && _.indexOf(event.role, SPEAKER) >= 0; 
      });
    })
    .pick(function (value) {
      return value && value.length;
    })
    .value();
})

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>

Upvotes: 1

Related Questions