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

jha*_*amm 18 javascript arrays underscore.js

我有一个函数,用于映射数组underscore.这是功能:

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

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

the*_*eye 36

_.map使用函数返回的任何内容来构建结果.如果函数没有显式返回任何内容,则JavaScript返回undefined.这就是为什么结果_.mapundefined每当条件失败.

你真正需要的是一个 _.filter

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

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

注意:您实际上可以使用_.matcher,随着_.filter,像这样的

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

var services = _.filter(userCopy.get('services'), isServiceSelected);
Run Code Online (Sandbox Code Playgroud)

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


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

var services = _.where(userCopy.get('services'), {
    service_selected: true;
});
Run Code Online (Sandbox Code Playgroud)

现在,将返回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
}));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)