2015-10-22 2 views
1

У меня есть следующий массив events. Для каждого события есть хэш, как {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" 
       ] 
      } 
     ], 
    } 
], 

Я хотел бы отфильтровать этот events массив содержит только участников, роль которых содержит speaker. Кроме того, когда в массиве участников нет динамиков, необходимо удалить соответствующую запись организации из объекта Hash (объект).

Чтобы отфильтровать массив объектов, я попытался с помощью этого:

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

Это, однако, не работает.

+1

'd.role' является массивом и, следовательно,' г == speaker' никогда не будет истинным – Jaco

+0

ваш первый '_.filter' не имеет возврата –

+0

'filter' возвращает новый массив, но вы ничего не делаете с ним. – Bergi

ответ

1

Попробуйте

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>

Смежные вопросы