如何为标签实现AND / OR逻辑?

时间:2012-01-24 20:00:14

标签: javascript jquery ajax tags logic

我有一个网络应用程序,向用户显示他们在特殊广告系列中的所有数据。这些广告系列可以使用不同的“标记”来保护其目的(增长,保留,忠诚度),而不仅仅是我在这里给出的。

我正在寻找一种方法,允许更高级和智能的用户创建AND / OR子句组,使他们能够专门针对某些针对其策略的广告系列。

我的标签很简单,基于索引标题。我可以为用户生成广告系列列表,但我希望在用户端实际过滤广告系列,因为他们可以下载广告系列。该网站还会包含“新”广告系列代码等内容。

因此,如果我有filterExpression喜欢“(保留+增长)|忠诚度”,我应该会看到所有广告系列都标有保留和增长,或忠诚度。

思考?

现在我的逻辑导致了双眼。

编辑:Psuedo-Example:

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"

1 个答案:

答案 0 :(得分:5)

  1. 将表达式解析为中缀形式,如@dave所述。
  2. 使用递归算法将其转换为disjunctive normal form,即顶层的所有|运算符,以及所有+运算符。您上面给出的示例已经是这样的形式。粗略地说,您的算法应递归查找x+(y|z)形式的术语,并将其替换为(x+y)|(x+z)并展平嵌套+| s。
  3. 现在,您可以检查一组标签是否与表达式匹配,方法是检查是否有任何分支的标签都贴在相关项目上。
  4. 或者,如果您需要速度,请查看BDD s。