过滤嵌套的对象数组

时间:2015-10-22 09:39:36

标签: javascript underscore.js

我有以下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的参与者。 此外,当参与者阵列中没有发言者时,需要从哈希(对象)中删除相应的组织条目。

为了过滤对象数组,我尝试使用它:

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

然而,这不起作用。

1 个答案:

答案 0 :(得分: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>