当我返回`false`时,为什么`_. map`返回undefined?

时间:2014-01-04 11:45:08

标签: javascript arrays underscore.js

我有一个函数,它使用underscore映射数组。这是功能:

var services = _.map(userCopy.get('services'), function (service) {
    if (service.service_selected === true) {
        return service;
    }
});

我的问题是,当conditional === false时,我会undefined进入services。当然我可以删除undefined,但这很难看,我只想正确使用map。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:34)

_.map使用函数返回的任何内容来构建结果。如果函数未显式返回任何内容,则JavaScript返回undefined。这就是为什么只要条件失败,_.map的结果就会undefined

您实际需要的是_.filter

var services = _.filter(userCopy.get('services'), function(service) {
    return service.service_selected === true;
});

_.filter接受集合和谓词函数。它将谓词函数应用于集合的每个值,如果函数返回true,则该元素将包含在结果中,如果函数返回false,则该元素将被跳过。< / p>

注意:您实际上可以使用_.matcher_.filter,就像这样

var isServiceSelected = _.matcher({
    service_selected: true;
});

var services = _.filter(userCopy.get('services'), isServiceSelected);

如果您要多次根据service_selected: true条件进行过滤,这将非常有用。如果它只是一次性的话,那么下面显示的_.where将是更好的选择。


您也可以使用_.where,只有当前对象包含列出的所有键值对时才能返回对象,例如

var services = _.where(userCopy.get('services'), {
    service_selected: true;
});

现在,将返回所有服务对象,其service_selected属性值为true


<强>演示:

function display(heading, data) {
    var json = JSON.stringify(data, null, 4);
    document.body.appendChild(document.createElement('h3')).innerHTML = heading;
    document.body.appendChild(document.createElement('pre')).innerHTML = json;
}


var data = [{
    "name": "auth",
    "service_selected": true
}, {
    "name": "authorization",
    "service_selected": false
}, {
    "name": "faltu",
    "service_selected": true
}];


display("_.filter", _.filter(data, function (service) {
    return service.service_selected === true;
}));

display("_.matcher", _.filter(data, _.matcher({
    service_selected: true
})));

display("_.where", _.where(data, {
    service_selected: true
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>