JavaScript 遞歸創(chuàng)建多叉樹

(一) 創(chuàng)建一個 Node 類,生成樹的結點茧痕。

export default class Node {
  name = '';

  constructor(name) {
    this.name = name;
  }

  children = [];

  add(children) {
    for (let i = 0; i < children.length; i += 1) {
      const child = children[i];

      if (child === null) {
        return this;
      }

      if (child.parent != null) {
        children[i].parent.remove(child);
      }

      child.parent = this;
      this.children.push(child);
    }

    return null;
  }

  remove(child) {
    const index = this.children.indexOf(child);

    if (index > -1) {
      child.parent = undefined;

      this.children.slice(index, 1);

      return child;
    }

    return null;
  }
}

(二) 根據測試數據财岔,遞歸生成多叉樹。

const testNode = {
  n0: {
    children: ['n1', 'n2', 'n5'],
  },
  n1: {
    children: ['n3', 'n8', 'n7'],
  },
  n2: {
    children: [],
    meshes: ['m1'],
  },
  n3: {
    children: ['n4'],
  },
  n4: {
    children: [],
    meshes: ['m0'],
  },
  n5: {
    children: [],
    meshes: ['m1'],
  },

  n6: {
    children: [],
  },
  n7: {
    children: ['n10'],
  },
  n8: {
    children: [],
    meshes: ['m2'],
  },
  n9: {
    children: [],
    meshes: ['m3'],
  },
  n10: {
    children: [],
    meshes: ['m4'],

  },
};

/**
 * meshes 測試數據
 */
const meshesObj = {
  children: [
    {
      aa: 'bb',
    },
    {
      aa: 'bb',
    },
    {
      aa: 'bb',
    },
    {
      aa: 'bb',
    },
    {
      aa: 'bb',
    },
    {
      aa: 'bb',
    },
  ],
};

/**
 * 遞歸遍歷生成多叉樹
 *
 * @param {*} node - nodes 列表中的一個 node
 * @param {*} parentNode - node 的父結點盏浇,為 Node 對象。
 */
const traverseNodes = (node, parentNode) => {
  if (node.children.length > 0) {
    const { length } = node.children;

    for (let i = 0; i < length; i += 1) {
      const nodeName = node.children[i];
      const childNode = new Node(nodeName);
      parentNode.add([childNode]);
      const newChildren = testNode[nodeName];
      traverseNodes(newChildren, childNode);
    }
  } else {
    const { meshes } = node;
    const meshesLsit = [];

    for (let i = 0; i < meshes.length; i += 1) {
      const meshName = meshes[i];
      for (let j = 0; j < meshesObj.children.length; j += 1) {
        const mesh = meshesObj.children[j];
        if (mesh.name === meshName) {
          meshesLsit.push(mesh);
        }
      }
    }

    parentNode.add(meshesLsit);
  }
};

// 多叉樹的根結點
const root = new Node('n0');

traverseNodes(testNode.n0, root);

console.log(root);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末芽狗,一起剝皮案震驚了整個濱河市绢掰,隨后出現的幾起案子,更是在濱河造成了極大的恐慌童擎,老刑警劉巖滴劲,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異顾复,居然都是意外死亡班挖,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門芯砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧芙,“玉大人给梅,你說我怎么就攤上這事∷荆” “怎么了破喻?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盟榴。 經常有香客問我曹质,道長,這世上最難降的妖魔是什么擎场? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任羽德,我火速辦了婚禮,結果婚禮上迅办,老公的妹妹穿的比我還像新娘宅静。我一直安慰自己,他們只是感情好站欺,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布姨夹。 她就那樣靜靜地躺著,像睡著了一般矾策。 火紅的嫁衣襯著肌膚如雪磷账。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天贾虽,我揣著相機與錄音逃糟,去河邊找鬼。 笑死蓬豁,一個胖子當著我的面吹牛绰咽,可吹牛的內容都是我干的。 我是一名探鬼主播地粪,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼取募,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟆技?” 一聲冷哼從身側響起玩敏,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎付魔,沒想到半個月后聊品,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡几苍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了陈哑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻坝。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡伸眶,死狀恐怖,靈堂內的尸體忽然破棺而出刽宪,到底是詐尸還是另有隱情厘贼,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布圣拄,位于F島的核電站嘴秸,受9級特大地震影響,放射性物質發(fā)生泄漏庇谆。R本人自食惡果不足惜岳掐,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饭耳。 院中可真熱鬧串述,春花似錦、人聲如沸寞肖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽新蟆。三九已至觅赊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琼稻,已是汗流浹背茉兰。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣簇,地道東北人规脸。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像熊咽,于是被迫代替她去往敵國和親莫鸭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容