Javascript 如何实现标记的和/或逻辑?

Javascript 如何实现标记的和/或逻辑?,javascript,jquery,ajax,tags,logic,Javascript,Jquery,Ajax,Tags,Logic,我有一个web应用程序,它向用户显示了他们所有的数据,这些数据都与特别活动有关。这些活动可以有不同的“标签”,以确保其目标(增长、保留、忠诚度)比我在这里给出的多得多 我正在寻找的是一种方法,允许更高级、更智能的用户创建一组和/或子句,使他们能够专门查找针对其战略的特定活动 我的标签很简单,基于标题的索引。我可以为用户生成活动列表,但我希望在用户端对活动进行实际筛选,因为他们可以下载活动。该网站还将有诸如“新”活动标签之类的东西 因此,如果我有一个filterExpression如“(保留+增长

我有一个web应用程序,它向用户显示了他们所有的数据,这些数据都与特别活动有关。这些活动可以有不同的“标签”,以确保其目标(增长、保留、忠诚度)比我在这里给出的多得多

我正在寻找的是一种方法,允许更高级、更智能的用户创建一组和/或子句,使他们能够专门查找针对其战略的特定活动

我的标签很简单,基于标题的索引。我可以为用户生成活动列表,但我希望在用户端对活动进行实际筛选,因为他们可以下载活动。该网站还将有诸如“新”活动标签之类的东西

因此,如果我有一个
filterExpression
如“(保留+增长)|忠诚度”,我应该看到所有标记有保留和增长或忠诚度的活动

想法

现在我的逻辑引起了人们的误解

编辑:Psuedo示例:

  • 将表达式解析为中缀形式,如@dave所述
  • 使用递归算法将其转换为,也就是说,所有
    |
    运算符都位于顶层,所有
    +
    运算符都位于顶层。你上面给出的例子已经是这样的形式了。大致上,您的算法应该递归地查找
    x+(y | z)
    形式的项,并将它们替换为
    (x+y)|(x+z)
    ,并展平嵌套的
    +
    s和
    s
  • 现在,您可以通过检查是否存在所有标记都附加到相关项上的分离点来检查一组标记是否与表达式匹配
  • 或者,如果你需要速度,看看s

  • 将表达式解析为中缀形式,如@dave所述
  • 使用递归算法将其转换为,也就是说,所有
    |
    运算符都位于顶层,所有
    +
    运算符都位于顶层。你上面给出的例子已经是这样的形式了。大致上,您的算法应该递归地查找
    x+(y | z)
    形式的项,并将它们替换为
    (x+y)|(x+z)
    ,并展平嵌套的
    +
    s和
    s
  • 现在,您可以通过检查是否存在所有标记都附加到相关项上的分离点来检查一组标记是否与表达式匹配

  • 或者,如果您需要速度,请查看s.

    我不知道您的对象、html或代码是什么样子,因此根据当前问题的内容很难提供帮助。我很确定我遗漏了一些信息或者我应该寻找如何实现这一点的地方。我的代码在这里没有帮助。好吧,这就是为什么我可以成为更多的助手;我不知道您使用什么语言来显示网站,我不知道您希望如何为用户创建一种方式来完成他们正在做的事情(回发、Ajax),我不知道你的数据是如何存储的,所以我不能告诉你更好的过滤数据的方法。我不知道这是否会有帮助-我想人们会被这样一个事实所吸引,即你没有说活动最终是如何显示的,即使这些信息不是必需的。我想你的问题只是“我有一个带有标记的实体列表,我如何使用JavaScript和用户输入过滤它们,比如”(tagA&tagB)| tagC’”。我不知道你的对象、html或代码是什么样子的,因此根据当前问题的内容很难提供帮助。我很确定我遗漏了一些信息或者我应该寻找如何实现这一点的地方。我的代码在这里没有帮助。好吧,这就是为什么我可以成为更多的助手;我不知道您使用什么语言来显示网站,我不知道您希望如何为用户创建一种方式来完成他们正在做的事情(回发、Ajax),我不知道你的数据是如何存储的,所以我不能告诉你更好的过滤数据的方法。我不知道这是否会有帮助-我想人们会被这样一个事实所吸引,即你没有说活动最终是如何显示的,即使这些信息不是必需的。我想你的问题只是“我有一个带有标记的实体列表,我如何使用JavaScript和用户输入过滤它们,比如”(tagA&tagB)| tagC’”。哇,好吧,这似乎是我要找的东西。这很难看,但我会蹲下来想办法的。谢谢哇,好吧,这好像是我要找的东西。这很难看,但我会蹲下来想办法的。谢谢
    Growth OR Loyalty OR Retention
    = 0|1|2
    
    filterPass = [ [0], [1], [2] ]
    CampaignTags = [ 1,4,5,6 ]
    //This campaign passes because it has "1"
    
    
    (Growth AND Loyalty) OR Retention
    = (0+1)|2
    
    filterPass = [ [0,1] , [2] ]
    CampaignTags = [ 1,4,5,6 ]
    //Fails because it doesn't have "0" AND "1", OR "2"