учитывая массив, представляющий иерархию, вывод данных в виде дерева в JS - PullRequest
0 голосов
/ 30 мая 2018

Дан файл данных, который имеет массив, представляющий иерархию.Создайте древовидную структуру данных, написав скрипт на 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 (то есть не имеет метода класса, если не использует Typescript.)

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете сделать это со структурой данных в виде дерева, вам нужно только зациклить массив строк, содержащий данные, и разделить их на точки, а затем добавить каждый элемент в экземпляр дерева, который будет создан при выполнениифункция, которая принимает ваш массив и вывод в виде древовидной структуры данных.

этот код может помочь вам

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));
0 голосов
/ 30 мая 2018

Вы можете использовать что-то похожее на дерево Trie.Способ добавления узла должен быть гораздо более конкретным.Но это возможно с чем-то вроде этого.

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.enter image description here

...