是否有树结构或算法在树中的水平周围移动?

时间:2011-08-18 15:46:23

标签: javascript algorithm data-structures tree rotation

我认为这是一个有趣的问题。

基本上,我有一个项目列表,其中每个项目都有一组固定的元数据,具有不同的值。

例如:

  • 第1项:{Type =“Text”,作者=“用户A”,编辑日期=“03/03/2003”}
  • 第2项:{Type =“Table”,作者=“用户A”,编辑日期=“04/05/2006”}
  • 第3项:{Type =“Image”,作者=“用户B”,编辑日期=“05/05/2005”}
  • 第4项:{Type =“Text”,作者=“用户B”,编辑日期=“05/07/2007”}

现在,按照目前的情况,该项目清单已展平并显示在表格中。

但是,我们希望找到一种方法来允许用户在树中浏览它,但增加了灵活性,他们可以“转动”每个元数据标签的顺序出现在树中。

所以,最初可能看起来像:

Items
+ Table
  + User A
    + 04/05/2006
      -> Item 2
    -> Item 2
  -> Item 2
+ Text
  + User A
    + 03/03/2003
      -> Item 1
    -> Item 1
  + User B
    + 05/07/2007
      -> Item 4
    -> Item 4
  -> Item 1
  -> Item 4
+ Image
  ..

但是,假设用户想要翻转并查看与特定用户相关的所有项目:

Items
+ User A
  + Text
  + Table
  -> Item 1
  -> Item 2
+ User B
  + Image
  + Text
  -> Item 3
  -> Item 4

等等。

我希望这是有道理的。

那么,我想知道的是,是否有最佳实践方法以低成本实现这一目标?每个'翻转/随机播放/转轴'的结果很好地表示在树中,因此显然首先想到的是当用户请求更改表示时,可以根据需要生成项目列表的新树。但是,我希望也许有更好的方法,只需旋转一棵树等。

另外,如果后端只是简单地返回一个项目的平面列表,那么这个用户的浏览器可以通过JavaScript以便宜的方式完成吗?

非常感谢&亲切的问候,

杰米

2 个答案:

答案 0 :(得分:1)

您想要在树结构中呈现元素,但是具有可变树深度和更改树分支:我怀疑树结构是否是您想要的。

我认为你应该考虑世界是平的(就像你的桌子一样)。一个javascript数据库可以提供帮助(有http://taffydb.com/

仍在考虑世界是平的,你也可以创建一个返回字符串的签名函数

separator="µ"; //TODO Find something better
function signature() {
  return item.Type + separator + item.Author + separator + item.EditedDate;
}


assert(item1.signature == "TextµUser Aµ03/03/2003")

然后使用此签名作为密钥将对象存储在简单字典中。

然后,您可以在键上执行正则表达式匹配以获取所需的对象。 首先,如果相应的项属性未定义,则编辑签名函数以返回“([^ separator] +)”。

assert ({Type="Text"}.signature() == "Textµ[^µ]+µ[^µ]+")

function find(filterItem) {
  retval= = new generic.list();
  for (var k in dict.keys()) {
    if (k.match(regexp)) {
      retval.add(dcit[k]);
    }
  }
}

我不知道这是否比浏览所有元素更快。

答案 1 :(得分:0)

我想解决这个问题的方法是定义一个类似于这样的列表项:

public class Item
{
    string NodeName {get; set;}
    string Url {get; set;}
    List<Item> Children {get; set;}
}

这是c#-code,但这个想法应该适用于任何支持对象的语言。现在您的列表只需要支持一种类型的列表,这是Item的列表,所以您需要做的就是找到一种方法将数据转换为这样的列表。