给定一个表示层次结构的数组,在 JS 中将数据输出为树形

given an array representing a hierachy, output data into a tree form in JS

给定一个数据文件,其中包含一个表示层次结构的数组。通过在 Javascript 中编写脚本来创建树数据结构。以树的形式输出数据:

数据文件:

["transportation.cars.Mazda",
 "transportation.cars.Honda",
 "transportation.cars.Toyota",
 "transportation.train.lightRail",
 "transportation.train.rapidTransit",
 "transportation.waterVehicle.ferry",
 "transportation.waterVehicle.boats" 
 ...]

树形输出:

 root
  transportation
    cars
      Mazda
      Honda
      Toyota
    train 
      lightRail
      rapidTransit
    waterVehicle
      ferry
      boats 

我的尝试:

var root = new Node('root'); 

var arr = ["transportation.cars.Mazda",
 "transportation.cars.Honda",
 "transportation.cars.Toyota",
 "transportation.train.lightRail",
 "transportation.train.rapidTransit",
 "transportation.waterVehicle.ferry",
 "transportation.waterVehicle.boats" 
 ]

for(var i of arr){
   var res=i.split(".");
    root.addChild(new Node(res[0]));
    res[0].addChild(new Node(res[1])); 
    res[1].addChild(new Node(res[2])); 
 }

this.addChild = function(node) {
    node.setParentNode(this);
    this.children[this.children.length] = node;
} 
console.log(root);

我正在尝试使用 JavaScript 创建树结构,但它与 Java 中的功能不同(即它没有 class 方法,除非使用打字稿。)

您可以使用类似于特里树的东西。添加节点的方式必须更加具体。但是这样的事情是可能的。

function Node(word)
{
  this.value = word;
  this.children = {};
}

function AddDotChain(chain)
{
  let arr = chain.split('.');
  let currentNode = this;

  function recurse(currentIndex)
  {
    if(currentIndex === arr.length)
    {
      return;
    }

    let currentWord = arr[currentIndex];
    if(currentNode.children[currentWord])
    {
      currentNode = currentNode[currentWord];
      return recurse(currentIndex + 1);
    }

    let child = new Node(currentWord);
    currentNode.children[currentWord] = child;
    currentNode = child;
    return recurse(currentIndex + 1);
  }
}

你只是把整个链条拍进去而不分开。我的逻辑某处可能存在缺陷,但总体思路应该可行。如果您想减少递归的开销,也可以迭代地完成此操作。请原谅乱七八糟的内容,已尝试尽快输入此内容。

这是 repl.it 上的草率实施。

你可以做到,使用树这样的数据结构,你只需要遍历包含数据的字符串数组并将它们按点拆分,然后将每个项目添加到将在你创建时创建的树实例执行将您的数组作为树数据结构输出的函数。

此代码可以帮助您

var arr = ["transportation.cars.Mazda",
 "transportation.cars.Honda",
 "transportation.cars.Toyota",
 "transportation.train.lightRail",
 "transportation.train.rapidTransit",
 "transportation.waterVehicle.ferry",
 "transportation.waterVehicle.boats" 
 ];

function Node(data) {
 this.data = data;
 this.children = [];
}

function Tree(data) {
 this.root = null;
}

Tree.prototype.contains = function(data) {
 return this.find(data) ? true : false;
}

Tree.prototype.add = function(data, node) {
 const newNode = new Node(data);

 if (!this.root) {
  this.root = newNode;
  return;
 }

 const parent = node ? this.find(node) : null;
 
 if (parent) {
  if (!this.contains(data)) {
    parent.children.push(newNode);
  }
 }
}

Tree.prototype.find = function(data) {
 if (this.root) {
  const queue = [this.root];
  while(queue.length) {
   const node = queue.shift();
   if (node && node.data === data) {
    return node;
   }

   for(var i = 0; i < node.children.length; i++) {
    const child = node.children[i];
    queue.push(child);
   }
  }
 }
 return null;
}

function createTreeOfTransportation(arr) {
 const tree = new Tree();
 for(var i = 0; i < arr.length; i++) {
  const element = arr[i];
  const nodes = element.split('.');

  for (var j = 0; j < nodes.length; j++) {
   const currentNode = nodes[j];
   const parent = nodes[j-1];
   console.log(j, parent);
   tree.add(currentNode, parent);
  }
 }
 
 return tree;
}

console.log(createTreeOfTransportation(arr));