如何使用 underscore.js 过滤器获得结果?

How can I get the result with underscore.js filter?

这是测试数组:

var test = [
{
    "id": 1, 
    "team": [
        {
            "name": "Alex", 
            "age": 27, 
            "checked": true
        }, 
        {
            "name": "Bob", 
            "age": 35,
            "checked": false
        }
    ], 
    "checked": true
}, 
{
    "id": "2", 
    "team": [
        {
            "name": "Jack", 
            "age": 37, 
            "checked": false
        }, 
        {
            "name": "Tom", 
            "age": 29, 
            "checked": true
        }
    ], 
    "checked": true
}];

我想要得到的结果是这样的数组:

结果 = ["Alex", "Tom"];

结果数组包含团队中 "checked" 属性等于 true 的所有项目。 我尝试用 underscore.js filter 得到结果,但我无法得到正确的结果。 如果您有更好的解决方案,请告诉我。 这是我的代码:

_.filter(test, function(team) {
 _.filter(team, function(worker){
    if(worker.checked)
        return worker.name;
 });});

对多维数组使用过滤的一种方法是使用 filterany

_.filter(test, function(team) {
    return _.any(team.team, function(player) {
        return player.checked;
    });
});

您可以简单地使用 forEach function 来处理这个问题

var test = [...];

var result = [];

test.forEach(function(item) {
    item.team.forEach(function(worker) {
        if(worker.checked) {
            result.push(worker.name);
        }
    })
})

console.log(result)
//Return ["Alex","Tom"]

以下是在下划线和 lodash 中的使用方法:

Underscore jsfiddle:

var result = _.chain(test).pluck('team').flatten().filter({checked:true}).value();

Lodash jsfiddle:

var result = _(test).pluck('team').flatten().filter({checked:true}).value();

将团队数组放在一起,将它们展平,这样您就有了嵌套数组,在 属性 上进行过滤,结果是包含名称并检查为 true 的对象。如果你只想要名字,再做一次。

这是带有 shorter filter and just giving back the names:

的 underscorejs 版本
var result = _.chain(test).pluck('team').flatten().filter('checked').pluck('name').value();
// ["Alex", "Tom"]