我认为这是一个有趣的问题。
基本上,我有一个项目列表,其中每个项目都有一组固定的元数据,具有不同的值。
例如:
现在,按照目前的情况,该项目清单已展平并显示在表格中。
但是,我们希望找到一种方法来允许用户在树中浏览它,但增加了灵活性,他们可以“转动”每个元数据标签的顺序出现在树中。
所以,最初可能看起来像:
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以便宜的方式完成吗?
非常感谢&亲切的问候,
杰米
答案 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
的列表,所以您需要做的就是找到一种方法将数据转换为这样的列表。