【问题标题】:How to make array of arrays from a tree datastructure in javascript?如何从javascript中的树数据结构制作数组数组?
【发布时间】:2019-02-22 18:43:08
【问题描述】:

如何将上述数据结构转换为

[['Tywin'],['Jamie','Cersi', 'Tyrion'], ['Joeffry', 'Myrcella', 'Tomen', 'Lin']]

这是我的代码:

let Tree = function(name) {
  this.name = name;
  this.children = [];
}

Tree.prototype.addChild = function(parent, name) {
  const node = lannister.contains(parent);
  node.children.push(new Tree(name));
}

var lannister = new Tree('Tywin');

lannister.addChild('Tywin', 'Jamie');
lannister.addChild('Tywin', 'Cersi');
lannister.addChild('Tywin', 'Tyrion');
lannister.addChild('Cersi', 'Joffery');
lannister.addChild('Cersi', 'Myrcella');
lannister.addChild('Cersi', 'Tomen');
lannister.addChild('Tyrion', 'Lin');
bfs();

function bfs(check) {
  //   console.log('traverseBFS called: ', this);
  bfsArray = [];
  var queue = [this];
  var node;
  var tempAr = [];
  bfsArray.push([this.name]);

  while (queue.length > 0) {
    node = queue.shift();
    callback(node.name, node.children.length);
    console.log('current node is: ', node, node.children.length);

    for (var i = 0; i < node.children.length; i++) {
      queue.push(node.children[i]);
      tempAr.push(node.children[i].name);
      if (i === node.children.length - 1) {
        // console.log('The bfs is ', bfsArray, tempAr);
        bfsArray.push(tempAr);
        tempAr = [];
      }
    }
  }

  function callback(itm, length) {

    // console.log('itm is: ', itm);
    if (itm === check) {
      node;
    }
  }
};

【问题讨论】:

  • 是的,我需要找到任何给定节点的父、子和兄弟关系。你知道如何在 javascript 中做到这一点吗?
  • 第 19 行包含第一个错误:“TypeError: lannister.contains is not a function”

标签: javascript arrays data-structures tree


【解决方案1】:

您可以使用数组和递归函数来存储级别并将名称推送到相关级别。

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

function Tree(name) {
    this.tree = new Node(name);
}

Tree.prototype.addChild = function (parent, child) {
    function findParent(node) {
        var found;
        if (node.name === parent) return node;
        node.children.some(n => found = findParent(n));
        return found;
    }
    var node = findParent(this.tree) || this.tree;
    node.children.push(new Node(child));
};

Tree.prototype.BST = function () {
    const getNodes = (level = 0) => node => {
        levels[level] = levels[level] || [];
        levels[level].push(node.name);
        node.children.forEach(getNodes(level + 1));
    };

    var levels = [];
    getNodes()(this.tree);
    return levels;
}

var lannister = new Tree('Tywin');

lannister.addChild('Tywin', 'Jamie');
lannister.addChild('Tywin', 'Cersi');
lannister.addChild('Tywin', 'Tyrion');
lannister.addChild('Cersi', 'Joffery');
lannister.addChild('Cersi', 'Myrcella');
lannister.addChild('Cersi', 'Tomen');
lannister.addChild('Tyrion', 'Lin');

console.log(lannister.BST());
console.log(lannister);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 就像一个魅力......你是一个救生员!非常感谢
【解决方案2】:

一个肮脏的解决方案:将对象用作树结构并将字符名称保留在对象键中。

let family_tree = {
   Jamie: {},
   Cersei: {Joeffry: {}, Myrcella: {}, Tomen: {}},
   Tyrion: {Lin: {}}
}

如果需要循环遍历对象,请使用Object.keys(family_tree) 方法。

【讨论】:

  • 这绝不是一个解决方案。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多