Tôi cảm thấy đặc biệt có cảm hứng để trả lời câu hỏi này vì tài liệu tham khảo về DotA. :)
Vì vậy, nếu tôi hiểu vấn đề một cách chính xác, bạn không cần phải kiểm tra mọi kết hợp mà nên thêm nhiều lần khóa vào query đối tượng dựa trên nội dung của ba biến phiên. Tôi nghĩ điều sau đây về mặt logic tương đương với returnFilterQuery của bạn chức năng trên.
var returnFilterQuery = function() {
var query = {game: 'dota'};
var modifyQueryIfArray = function(key, sessionKey) {
var value = Session.get(sessionKey);
if (!_.isEmpty(value))
query[key] = {$in: value};
};
modifyQueryIfArray('gamemode', 'dotaMode');
modifyQueryIfArray('region', 'dotaRegion');
modifyQueryIfArray('skill', 'dotaSkill');
return Session.set('dotaFilter', query);
};
Lưu ý rằng isEmpty có thể là một kiểm tra an toàn hơn length trong trường hợp biến phiên không phải là một mảng.