【问题标题】:How can you implement AND/OR logic for tags?如何为标签实现 AND/OR 逻辑?
【发布时间】:2012-01-24 20:00:14
【问题描述】:

我有一个 Web 应用程序,可以向用户显示他们存储在特殊广告系列中的所有数据。这些广告系列可以有不同的“标签”,这些标签可以表明他们的目的(增长、保留、忠诚度)比我在这里给出的要多得多。

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

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

因此,如果我有一个filterExpression,例如“(Retention+Growth)|Loyalty”,我应该会看到所有标记为 Retention AND Growth 或忠诚度的广告系列。

想法?

现在我的逻辑引起了对视。

编辑:伪示例:

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"

【问题讨论】:

  • 我不知道您的对象、html 和代码是什么样的,因此根据当前问题的内容很难提供帮助。 tinyurl.com/so-hints
  • 我很确定我错过了一些信息或我应该寻找如何实现这一点的地方。我的代码在这里没有用。
  • 好吧,这就是为什么我可以成为更多的助手;我不知道您使用什么语言来显示网站,我不知道您想如何为用户创建他们正在做的事情的方式(回发,Ajax),我不知道您的数据如何已存储,因此我无法告诉您过滤数据的更好方法。
  • 我不知道这是否会有所帮助 - Parsing expressions in infix notation
  • 我认为人们已经注意到了这样一个事实,即您没有说明活动最终是如何显示的,即使这些信息不是必需的。我认为您的问题只是“我有一个带有标签的实体列表,我如何使用 JavaScript 过滤它们并输入来自用户的输入,例如 '(tagA & tagB) | tagC'”。

标签: javascript jquery ajax tags logic


【解决方案1】:
  1. 将表达式解析为中缀形式,如 @dave 所述。
  2. 使用递归算法将其转换为disjunctive normal form,也就是说,所有| 运算符都在顶层,所有+ 运算符都在顶层。你上面给出的例子已经是这样的形式了。粗略地说,您的算法应该递归地找到 x+(y|z) 形式的术语,并将它们替换为 (x+y)|(x+z) 并将嵌套的 +s 和 |s 展平。
  3. 您现在可以检查一组标签是否与表达式匹配,方法是检查是否存在标签全部附加到相关项目的析取词。

或者,如果您需要速度,请查看BDDs。

【讨论】:

  • 哇哦,好吧,这似乎是我要找的东西。这很丑陋,但我会蹲下来弄清楚。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2010-10-16
  • 2013-12-06
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多