更好的过滤集合模式

2023-12-25

我有一个名为Games我希望用户使用复选框来过滤集合。每次选中/取消选中复选框时,都会调用流星订阅来显示相应的内容Games

以下是订阅的示例(不是正确的 mongo 代码):

{region: ['east','west','eu'], skill: ['casual','amatuer','pro'], gamemode: ['ctf','dm','etc']}

在这个特定的游戏中,您可以按地区、技能和游戏模式进行过滤,每种都有多种组合。

Edit:

我需要的是创建适当的选择器,具体取决于选中的复选框。

首先,我抓取每个组的选中复选框,并将它们放入一个数组中,然后将该数组设置为会话变量。

// Gamemode Group
'click .mode input[type=checkbox]': function(ev, tpl) {
    var mode = tpl.$('.mode input:checked').map(function () {
        return $(this).val();
    });

    var modeArray = $.makeArray(mode);
    Session.set('dotaMode', modeArray);
    returnFilterQuery();
},

然后我检查每个组数组以查看它们是否已填充,如果是,则将它们添加到最终选择器(query)我将其传递到订阅中。我的问题是我必须检查每种可能的情况,但除了if语句,一旦我开始添加更多组(游戏模式、区域、技能等)进行搜索,就会有更多的组合。

function returnFilterQuery(){
    //check all fields and create a query object
    var query = { game: 'dota' };
    var gamemode = Session.get('dotaMode');
    var region = Session.get('dotaRegion');
    var skill = Session.get('dotaSkill');

    // if no region or skill is selected, show user all
    if (region.length && skill.length && gamemode.length) {
        query.region = { $in: region };
        query.skill = { $in: skill };
        query.gamemode = { $in: gamemode };
    } else if (region.length && !skill.length && gamemode.length) {
        query.region = { $in: region };
        query.gamemode = { $in: gamemode };
    } else if (!region.length && skill.length && gamemode.length) {
        query.skill = { $in: skill };
        query.gamemode = { $in: gamemode };
    } else if (!region.length && !skill.length && gamemode.length) {
        query.gamemode = { $in: gamemode };
    } else if (region.length && skill.length && !gamemode.length) {
        query.region = { $in: region };
        query.skill = { $in: skill };
    } else if (region.length && !skill.length && !gamemode.length) {
        query.region = { $in: region };
    } else if (!region.length && skill.length && !gamemode.length) {
        query.skill = { $in: skill };
    }

    return Session.set('dotaFilter', query);
};

希望这一切都有道理。我确信必须有更好的方法,我只是现在想不出什么。谢谢。


由于 DotA 的参考,我对回答这个问题感到特别有启发。 :)

因此,如果我正确理解问题,您不需要检查每个组合,而是重复将键添加到query基于三个会话变量的内容的对象。我认为以下内容在逻辑上等同于你的returnFilterQuery上面的函数。

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);
};

注意isEmpty可能比检查更安全length如果会话变量不是数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更好的过滤集合模式 的相关文章

随机推荐

  • HTTP响应头:多个Link值

    我正在为 Rails 应用程序进行 SEO 该网站已完全本地化 我正在关注这篇谷歌文章 https support google com webmasters answer 189077 hl en to add hreflang 替代品页
  • ggplot2中同一图例内的不同图例键

    假设我不需要 正确的 变量映射 但仍然希望有图例键来帮助图表理解 我的实际数据类似于以下df df lt data frame id 1 10 line rnorm 10 points rnorm 10 library ggplot2 gg
  • xlsxwriter:text_wrap() 不起作用

    我正在创建 Excel 文件并对其进行格式化 并希望将文本换行到列中 我在 xlsxwriter 中找到了 text wrap 方法 但是当我使用此方法时 它对我不起作用 我尝试了一切但失败了 我在脚本中所做的事情 使用 pandas 读取
  • Laravel:$request->hasFile() 不起作用

    我有一张表格 可以在其中获得title description and an image 当我dd requests gt all 它返回以下正确的内容 array 4 projectTitle gt asd project descrip
  • Coldfusion 10 的 cfdocument pdf 中未显示图像

    我使用的是ColdFusion 10企业版 使用时无法显示图像CFDOCUMENT生成 PDF 下面是我正在使用的一段代码
  • matplotlib 中 LaTeX 轴标签的粗体字体粗细

    In matplotlib http matplotlib org 您可以将轴标签的文本设置为粗体 plt xlabel foo fontweight bold 您还可以将 LaTeX 与正确的后端一起使用 plt xlabel r phi
  • PHP - MySQL 从产品表创建树视图

    我有一个类别表如下 我正在该表中保存类别 子类别 多个子类别 我的桌子看起来像 id name parent of created on 1 Name 1 0 2013 05 1 00 00 00 2 Name 2 0 2013 05 1
  • 需要解释此代码如何处理 Arraylist 值

    public static void mystery1 ArrayList
  • Angular 的 ngTouch 库可以用来检测长按(触摸/按住/释放到位)事件吗?

    我的 AngularJS 应用程序需要能够检测触摸事件的开始和停止 无需滑动 例如 我需要在触摸开始时执行一些逻辑 用户按下手指并按住 然后在同一触摸结束时执行不同的逻辑 用户移开手指 我正在考虑为该任务实现 ngTouch 但 ngTou
  • 从Java开始忽略/捕获子进程输出的最简单方法

    java中的子进程非常昂贵 每个进程通常由多个线程支持 托管进程的线程 Linux 上的 JDK 1 6 一个读取 打印 忽略输入流的线程 另一个线程读取 打印 忽略错误流 更多线程来执行超时和监视并由应用程序终止子进程 业务逻辑线程 ho
  • 与 pytest 一起使用时禁用日志记录

    我在同时使用 pytest 和日志记录时遇到问题 当我单独运行一个程序时 我可以看到它的消息打印在屏幕上以及文件 test log 中 python3 main py gt prints on terminal and also in te
  • 确定绝对id

    如何确定organizationUnit的绝对id 来自 webapp resources acme organizationUnit xhtml 当我从树中选择一个节点时 organizationUnit 应显示所选节点 我无法使用相对
  • AVFoundation 使用 Alpha 通道解码 prores4444 电影

    我正在尝试使用 Swift 在 iOS 上使用 alpha 通道解码 prores4444 视频 将其作为复杂的动画叠加在用户视频上并将其导出到他的库中 AVFoundation 文档不是那么好 我正在努力寻找任何代码示例 当我尝试将下面的
  • PHP中如何检查一个方法是否是静态的?

    我需要知道该方法是否在给定其名称和包含该方法的类的名称的情况下声明为静态 method exists提供true对于静态和非静态方法 下面是关于如何使用 ReflectionMethod 的更清晰的方法 MethodChecker new
  • Python 中的字符串反转

    我接受了一个整数输入并尝试在 Python 中反转它 但徒劳 我把它改成了字符串 但仍然不能 有什么办法可以逆转吗 有没有内置的功能 我无法将整数转换为列表 因此无法应用反向函数 您可以使用切片运算符来反转字符串 s hello world
  • nginx proxy_pass 通过 https_proxy

    我正在尝试使用此配置设置 nginx 要访问 backend mygreat server com 我必须通过我的公司代理 即 myproxy server com 80 因此 我将其添加到 etc environment 中 https
  • 如何获取最新的 Chrome(版本 55)以允许混合内容?

    我有一个 chrome 扩展 它在开发中使用 HTTP 进行通信 在生产中使用 HTTPS 进行通信 我从使用 HTTPS 的网页运行它 当我在开发模式下使用此扩展时 出现以下错误 混合内容 页面位于 https somesite com
  • FFmpeg 将 .mp3 输出保存到变量中

    在我的应用程序中 我想修改各种mp3 然后将它们混合在一起 我知道我可以在 FFmpeg 中使用单个命令行来完成此操作 但它最终可能会非常混乱 因为我需要在每个样本上使用各种过滤器 而我有五个过滤器 我的想法是单独编辑每个样本 将它们保存到
  • LDAP 服务器不可用

    我对此完全是新手 尝试连接到 LDAP 服务器PrincipalContext 我已经尝试了该网站上的所有解决方案 但均无济于事 我尝试过的事情 PrincipalContext insPrincipalContext new Princi
  • 更好的过滤集合模式

    我有一个名为Games我希望用户使用复选框来过滤集合 每次选中 取消选中复选框时 都会调用流星订阅来显示相应的内容Games 以下是订阅的示例 不是正确的 mongo 代码 region east west eu skill casual