我有一个函数,它使用underscore
映射数组。这是功能:
var services = _.map(userCopy.get('services'), function (service) {
if (service.service_selected === true) {
return service;
}
});
我的问题是,当conditional === false
时,我会undefined
进入services
。当然我可以删除undefined
,但这很难看,我只想正确使用map
。我该如何解决这个问题?
答案 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>