2017-02-14 59 views
0

我需要在圖形應用程序中實現分組/取消分組功能。目標是與Adobe Illustrator或Microsoft PowerPoint中的組/取消組合功能類似。分組和取消分組形狀的最佳數據結構是什麼

組可以被嵌套(即:一組可以同時包含元素和其他組,其中又包含元素或組)

我想知道什麼是做的最好的數據結構。

它應該可以很快告訴:一個元素

  • 是否是一組在
  • 其包含它

我想到的是這樣的最大批的兄弟姐妹:

{ 
    groups: { 
     g1: ['n1', 'n2', 'n3'], 
     g2: ['n4', 'n5', 'g1'], 
     g3: ['g2', 'n6', 'n7'] 
    }, 
    nodes { 
     n1: 'g1', 
     n2: 'g1', 
     n3: 'g1', 
     n4: 'g2', 
     n5: 'g2', 
     g1: 'n1', 
     g2: 'g3', 
     n6: 'g3', 
     n7: 'g3' 
    } 
} 

group含有組自己和nodes作爲一個查詢表來判斷一個節點是否在一個組中。我可以告訴節點和組與他們的ID不同(節點總是數字)。通過組遞歸將提供兄弟姐妹列表。

這將封裝在一個對象中,然後該對象將處理組,取消組合和檢入JavaScript。

這是否理智?有沒有更好的辦法?

+0

創建一個'node'類和一個'group'類,它將在內部將一系列nodesor組保存爲一個數組。節點(以及組)可以有一個'in_group'屬性,默認情況下爲false,或者從一個組中移除,或者對它所在的組引用。 – Connum

回答

1

爲什麼不使用樹結構?使用類似這樣的節點:

function Node (value, parent) { 
    this.value = value; 
    this.children = []; 
    this.parent = parent || null 
} 

Node.prototype.addChild = function (node) { … } 

Node.prototype.traverse = function (fx) { 
    fx(this); 
    this.children.forEach(function (child) { 
    child.traverse(fx); 
    }); 
} 
… 

var root = new Node({id: 100}, null); 

因此,您可以添加更多指針/引用以加快樹遍歷。爲了測試一個節點是否在一個組中,你只需要檢查它的父節點是否爲空。許多其他測試/查詢可以通過簡單的樹遍歷來執行。

相關問題