首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于层次结构的数据表示

基于层次结构的数据表示
EN

Stack Overflow用户
提问于 2018-08-18 13:19:31
回答 1查看 84关注 0票数 0

如上面所示,我有(层次结构)数据。

我需要

  • 显示此数据(UI)
  • 搜索名称字段

我必须使用哪种数据结构来解决这个问题?

显示此数据(UI):对于UI,我的计划是有一个按钮列表,当用户单击按钮时,它将转到下一个级别。例如,最初显示两个按钮'John‘和'Bobbys汽车’。当用户单击“John”时,它会清除屏幕并显示“John”中的内容,即“汉斯汽车零部件”和“xyz云解决方案”等两个按钮。

搜索名称字段:应该可以从所有级别搜索名称字段。例如,用户搜索汽车,它应该显示"Bobbys汽车“和"Hans汽车零部件”。

我现在有一个json数据,然后对其进行解析,并遍历对象以获得用户想要的内容(搜索不包括在内)。我认为使用现有的数据结构(如果有的话)来完成这项任务是明智的。

如果你需要我提供更多的信息,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 13:30:51

基本上,你有三个有意义的选择:

1)一棵树:

要将数据显示为树,底层数据结构也是一棵树是有意义的,例如:

代码语言:javascript
运行
复制
 const root = {
   name: "Har's holdings",
   code: "0001",
   children: [
     {
       name: "John software company",
       code: "0220",
       children: [/*...*/],
    },
    /*...*/
  ],
 };

因此,当显示基于node.children的按钮时,如果单击其中一个按钮,则将节点设置为该node = node.children[clicked]。现在,对于搜索来说,将树夷为平地是有意义的,这可以很容易地用生成器完成:

代码语言:javascript
运行
复制
  function* flatten(node) {
    yield node;
    for(const child of node.children)
      yield* flatten(child);
 }

它允许您以下列方式获得一个数组:

代码语言:javascript
运行
复制
  const nodes = [.. flatten(root)];

现在可以很容易地搜索该数组。

2)查表:

您可以根据节点的代码存储节点,并在每个节点中存储子节点代码,这样您就可以轻松地获得它们:

代码语言:javascript
运行
复制
  const byCode = {
    "0001": {
     name: "Har's holdings",
     code: "0001",
     children: ["0220", /*...*/],
   },

   "0220": {
     name: "John software company",
     code: "0220",
     children: [/*...*/]
  }
  //...
 };

获取一个节点的所有子节点可以这样做:

代码语言:javascript
运行
复制
  const childNodes = byCode["0001"].children.map(key => byCode[key]);

要获取所有节点的数组,请执行以下操作:

代码语言:javascript
运行
复制
  const nodes = Object.values(byCode);

3)数组

代码语言:javascript
运行
复制
  const nodes = [
    {
     name: "Har's holdings",
     code: "0001",
     children: ["0220", /*...*/],
    },
    {
     name: "John software company",
     code: "0220",
     children: [/*...*/]
   }
 ];

但是,要将其用作树,则必须将其转换为2):

代码语言:javascript
运行
复制
  const byCode = {};
  for(const node of nodes)
    byCode[node.code] = node;

您所选择的格式应该取决于存储方式,然后您可以根据用户端的使用情况轻松地在客户端上的一种格式之间进行转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51909079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档