【譯】使用 JavaScript 創(chuàng)建圖

banner

圖是由具有邊的節(jié)點集合組成的數(shù)據(jù)結(jié)構(gòu)臣淤。圖可以是有向的或者是無向的。

有向圖包含功能類似于單行道的邊晌姚。邊緣從一個節(jié)點流向另一個節(jié)點。

比如歇竟,你可能有一個(關(guān)于)人物和電影的圖表挥唠,其中每個人可以有多個喜歡的電影,但是電影沒有喜歡的人焕议。

directed_graph

無向圖包含雙向流動的邊緣宝磨,類似于雙向道路,兩個方向都有交通盅安。

比如唤锉,你可能有一個寵物圖表,其中每只寵物都有一個所有者别瞭,每個所有者都有一只寵物窿祥。

備注:(下面)雙向箭頭代表一條邊,但是為了顯而易見蝙寨,我繪制了兩條箭頭晒衩。

undirected_graph

圖(graph)中沒有明確的信息層次結(jié)構(gòu)嗤瞎。

方法

我們將創(chuàng)建一個(關(guān)于)人和冰淇凌口味的圖表。這將是一個有向圖听系,因為人們可以喜歡某些口味贝奇,但是味道可不喜歡人。

我們將創(chuàng)建三個類:

  • PersonNode
  • IceCreamFlavorNode
  • Graph

PersonNode

PersonNode類將接受一個參數(shù):一個人的名字靠胜。這將作為其標識符掉瞳。

PersonNode構(gòu)造函數(shù)將包含兩個屬性:

  • name:唯一標識符
  • favoriteFlavors:關(guān)于IceCreamFlavorNodes的數(shù)組

另外,PersonNode類包含一個方法:addFlavor浪漠。這將傳入一個參數(shù)陕习,一個IceCreamFlavorNode對象,并將其添加到數(shù)組favoriteFlavors中郑藏。

類的定義如下所示:

class PersonNode {
  constructor(name) {
    this.name = name;
    this.favoriteFlavors = [];
  }

  addFlavor(flavor) {
    this.favoriteFlavors.push(flavor);
  }
}

IceCreamFlavorNode

IceCreamFlavorNode類將傳入一個參數(shù):冰淇凌口味衡查。這將作為其標識符瘩欺。

這個類不需要包含任何方法必盖,因為這是一個無向圖,數(shù)據(jù)是從person流向flavors俱饿,但是不會回流歌粥。

這個類的定義如下:

class IceCreamFlavorNode {
 constructor(flavor) {
   this.flavor = flavor;
 }
}

Graph

Graph類不接受任何參數(shù),但是其構(gòu)造函數(shù)將包含三個屬性:

  • peopleNodes:人物節(jié)點數(shù)組拍埠。
  • iceCreamFlavorNodes:冰淇凌口味節(jié)點數(shù)組失驶。
  • edges:包含PersonNodesIceCreamFlavorNodes之間的邊緣數(shù)組。

Graph類將包含六個方法:

  • addPersonNode(name):接受一個參數(shù)枣购,一個人的名字嬉探,創(chuàng)建一個具有此名字的PersonNode對象,并將其推送到peopleNodes數(shù)組棉圈。
  • addIceCreamFlavorNode(flavor):接受一個參數(shù)涩堤,一個冰淇凌口味,創(chuàng)建一個具有這種口味的IceCreamFlavorNode對象分瘾,并將其推送到iceCreamFlavorNodes數(shù)組中构诚。
  • getPerson(name):接受一個參數(shù)混槐,一個人名字,并返回該人的節(jié)點。
  • getFlavor(flavor):接受一個參數(shù)碌补,一個冰淇凌口味,并返回該口味的節(jié)點凄鼻。
  • addEdge(personName, flavorName):接受兩個參數(shù)肢础,一個人的名稱和一個冰淇凌口味,檢索兩個節(jié)點肴掷,將flavor添加到人的favoriteFlavors數(shù)組敬锐,并將邊推送到edge數(shù)組辞嗡。
  • print():簡單打印出peopleNodes數(shù)組中的每個人,以及他們最喜歡的冰淇凌口味滞造。

類的定義如下所示:

class Graph {
  constructor() {
    this.peopleNodes = [];
    this.iceCreamFlavorNodes = [];
    this.edges = [];
  }

  addPersonNode(name) {
    this.peopleNodes.push(new PersonNode(name));
  }

  addIceCreamFlavorNode(flavor) {
    this.iceCreamFlavorNodes.push(new IceCreamFlavorNode(flavor));
  }

  getPerson(name) {
    return this.peopleNodes.find(person => person.name === name);
  }

  getFlavor(flavor) {
    return this.iceCreamFlavorNodes.find(flavor => flavor === flavor);
  }

  addEdge(personName, flavorName) {
    const person = this.getPerson(personName);
    const flavor = this.getFlavor(flavorName);
    person.addFlavor(flavor);
    this.edges.push(`${personName} - ${flavorName}`);
  }

  print() {
    return this.peopleNodes.map(({ name, favoriteFlavors }) => {
      return `${name} => ${favoriteFlavors.map(flavor => `${flavor.flavor},`).join(' ')}`;
    }).join('\n')
  }
}

虛擬數(shù)據(jù)

現(xiàn)在续室,我們有了三個類,我們可以添加一些數(shù)據(jù)并測試它們:

const graph = new Graph(true);
graph.addPersonNode('Emma');
graph.addPersonNode('Kai');
graph.addPersonNode('Sarah');
graph.addPersonNode('Maranda');
graph.addIceCreamFlavorNode('Chocolate Chip');
graph.addIceCreamFlavorNode('Strawberry');
graph.addIceCreamFlavorNode('Cookie Dough');
graph.addIceCreamFlavorNode('Vanilla');
graph.addIceCreamFlavorNode('Pistachio');

graph.addEdge('Emma', 'Chocolate Chip');
graph.addEdge('Emma', 'Cookie Dough');
graph.addEdge('Emma', 'Vanilla');
graph.addEdge('Kai', 'Vanilla');
graph.addEdge('Kai', 'Strawberry');
graph.addEdge('Kai', 'Cookie Dough');
graph.addEdge('Kai', 'Chocolate Chip');
graph.addEdge('Kai', 'Pistachio');
graph.addEdge('Maranda', 'Vanilla');
graph.addEdge('Maranda', 'Cookie Dough');
graph.addEdge('Sarah', 'Strawberry');

console.log(graph.print());

下面是我們有向圖看起來類似(的樣子):

demo

如果你想看完整的代碼谒养,到我的CodePen上查看挺狰。

后話

原文:https://dev.to/emmawedekind/creating-graphs-with-javascript-4efm

文章首發(fā):https://github.com/reng99/blogs/issues/22

同步掘金:https://juejin.im/post/5cda74345188256865155137

更多內(nèi)容:https://github.com/reng99/blogs

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市买窟,隨后出現(xiàn)的幾起案子丰泊,更是在濱河造成了極大的恐慌,老刑警劉巖始绍,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞳购,死亡現(xiàn)場離奇詭異,居然都是意外死亡亏推,警方通過查閱死者的電腦和手機学赛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吞杭,“玉大人盏浇,你說我怎么就攤上這事⊙抗罚” “怎么了绢掰?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長童擎。 經(jīng)常有香客問我滴劲,道長,這世上最難降的妖魔是什么顾复? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任班挖,我火速辦了婚禮,結(jié)果婚禮上捕透,老公的妹妹穿的比我還像新娘聪姿。我一直安慰自己,他們只是感情好乙嘀,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布末购。 她就那樣靜靜地躺著,像睡著了一般虎谢。 火紅的嫁衣襯著肌膚如雪盟榴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天婴噩,我揣著相機與錄音擎场,去河邊找鬼羽德。 笑死,一個胖子當(dāng)著我的面吹牛迅办,可吹牛的內(nèi)容都是我干的宅静。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼站欺,長吁一口氣:“原來是場噩夢啊……” “哼姨夹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矾策,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磷账,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贾虽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃糟,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蓬豁,在試婚紗的時候發(fā)現(xiàn)自己被綠了绰咽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡庆尘,死狀恐怖剃诅,靈堂內(nèi)的尸體忽然破棺而出巷送,到底是詐尸還是另有隱情驶忌,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布笑跛,位于F島的核電站付魔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏飞蹂。R本人自食惡果不足惜几苍,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陈哑。 院中可真熱鬧妻坝,春花似錦、人聲如沸惊窖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽界酒。三九已至圣拄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毁欣,已是汗流浹背庇谆。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工岳掐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饭耳。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓串述,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寞肖。 傳聞我的和親對象是個殘疾皇子剖煌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評論 0 21
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,985評論 6 13
  • 朋友轉(zhuǎn)的: 一架噴氣式戰(zhàn)機,拖著細細的長線從頭頂緩緩地劃過逝淹,在湛藍的天空留下印跡耕姊。今天是節(jié)日,飛行員也不放假...
    天行健君馬甲閱讀 119評論 0 2
  • 為什么人長大了就一定要結(jié)婚栅葡?結(jié)婚是為了什么茉兰?為什么結(jié)婚了就要立即生孩子?生孩子又是為了什么欣簇?是為了傳宗接代规脸?還是為...
    溥澤閱讀 337評論 2 0
  • 剛接觸“舞踏”,我覺得一般人都會和我一樣的反映:這是藝術(shù)嗎熊咽?這又能和美扯上半毛錢關(guān)系嗎莫鸭?這不怪尋常人會這么想,...
    Isla是我閱讀 646評論 0 0