在Javascript中提取与树对象相关的数据

Extracting tree object relevant data in Javascript

本文关键字:数据 对象 Javascript 提取      更新时间:2023-09-26

我有一个Javascript对象,如下所示:

MainData: Object
 ->SubData: Array[23]
   ->0:Object
       Name : "ABC"
       ID: 1
       ->DataToDisplay :Array[2]
         ->0:Object
           Guid :"18189-90"
           Geo : "USA"
         ->1 : object
           Guid : "234-8089"
           Geo :"UK"
         OtherIrrelevantData : SomeData
         ->Children:Array[20]
           ->0:Object
              Name:"DEF"
              ID:2
              ->DataToDisplay : Array[1]
                ->0:object
                Guid :"18167-90"
                Geo : "Nor"
              ->Children : Array[5]
                ->0:Object 
                   Name : "GHI"
                   ID : 3 
                   ->DataToDisplay :Array[2]
                    ->0:Object
                      Guid :"18189-90"
                      Geo : "Ger"
                    ->1 : object
                      Guid : "234-8089"
                      Geo :"Pol"
                    otherirrelevantData : SomeData  

我的目标是在html页面中递归地只显示数组"DataToDisplay"。例如:如果控件匹配名称:"ABC",我应该能够显示,5地理名称根"ABC"下的所有内容。我需要一个名称为"ABC"answers"DataToDisplay"的对象,以及名称为"DEF"answers"GHI"的对象。

如果数据与名称"GHI"匹配,我需要一个名称为"GHI"的对象,并在其下显示DataToDisplay

我正试图为它使用forach循环,但在添加节点时失败了。从以上信息中提取数据有什么建议吗?

树节点实用程序可以提供您所需要的。请参阅此演示中的"findNodes"函数:https://linsight.github.io/tree-node-utils/demo/dist/

以下是findNodes在ES6:中的实现

findNodes(nodes, predicate) {
  let found = [];
  const self = this;
  for (const node of nodes) {
    if (predicate(node)) {
      found = [...found, node];
    }
    if (self.hasChildren(node)) {
      const foundChildren = self.findNodes(node.children, predicate);
      found = [...found, ...foundChildren];
    }
   }
   return found;
  };

它的作用是:

  1. 循环通过所有根节点
  2. 对于它们中的每一个,使用回调函数predicate测试根节点
  3. 如果回调函数通过,则添加到结果数组
  4. 如果节点具有子级数据,则递归地对所有子级执行相同操作
  5. 返回结果

在您的情况下,您的predicate函数类似于:

function canDisplay(node){ return node.Name === 'ABC'; }