2013-02-06 53 views
2

我有一個層次結構對象,我通過父母走過並對孩子進行排序來對孩子進行排序。這工作。但現在,我需要選擇打破層次並創建新的虛擬限制。使用Javascript中的層次結構組排列多維對象(Node.js)

爲了說明這一點,我們舉一個男人的例子,他有x Wifes。與每個妻子,他有孩子。我可以根據每個妻子或每個人的妻子來分類孩子。

Man01 Wife01a  Kid01aA 
        Kid01aB 
     Wife01b  Kid01bC 
        Kid01bD 
Man02 Wife02c  Kid02cE 
        Kid02cF 
     Wife02d  Kid02dG 
        Kid02dH 

我們只是給他們的名字:

Murphy Winnie Kurt 
       Kara 
     Wendy Klaus 
       Klea 
Marley Wonda Kasper 
       Kyra 
     Wilma Kevin 
       Karla 

而且想想字母中父母對它們進行排序:

Marley Wilma Karla 
       Kevin 
     Wonda Kasper 
       Kyra 
Murphy Wendy Klaus 
       Klea 
     Winnie Kara 
       Kurt 

但是現在,我們希望能夠給孩子們那種屬於一個男人,或一般的妻子,或一般的孩子?

Marley Wilma Karla 
     Wonda Kasper 
     Wilma Kevin 
     Wonda Kyra 
Murphy Winnie Kara 
     Wendy Klaus 
     Wendy Klea 
     Winnie Kurt 

這是一個非常簡單的虛構物體。實際上,我沒有按字母順序排序,而是對許多屬性進行多列排序。

將結果輸出到表格可以,但處理本身已花費大量時間和內存。我不想讓這個更復雜。

如果這沒有問題,我只是將該對象平鋪爲一個數組中的表,將每個多列排序鏈接成一個超級多列排序,然後重新組合,從最接近的共同祖先開始,循環。

但我試圖以更有效的方式解決此問題,而無需將對象轉換爲完整的表數組。

  • 我該如何配戴? 實際上循環了他們每個人兩次?
    • 也許有一種'知名'的解決方案,這種排序,我只是不知道呢?
    • 也許有巫術可用,使用所有'虛擬'父母的引用來創建類似於表的記錄,然後將這些引用歸入層次結構中,而不會循環使用它們?

這裏我指的是那種對象的一個​​例子: 通過Object,我的意思是,毫不誇張地{},雖然對象包含數組對象{}當它有多個成員的[]

{ 
    "men" : [ 
     { 
      "name" : "Murphy", 
      // a lot of properties 
      "wifes" : [ 
       { 
        "name" : "Winnie", 
        // a lot of properties 
        "kids" : [ 
         { 
          "name" : "Kurt", 
          // a lot of properties 
         }, {}, {} // etc... 
        ] 
       }, {}, {} // etc... 
      ] 
     }, {}, {} // etc... 
    ] 
} 

請注意,在這種情況下,我的例子是錯誤的,因爲男人,妻子和孩子都是人類。但實際上有不同的對象具有不同的屬性。假設有多個宇宙,我應該選擇宇宙,星球,土壤或其他東西。;)

+0

+1爲漂亮的名字。但是,您能否告訴我們更多關於您的數據結構的信息,例如一個JSON-ish示例對象?你真的需要做這種類型的客戶端與JS,爲什麼你不使用你最喜歡的 DMS DBS? – Bergi

+0

這是服務器端JavaScript使用節點。這是'DMS'。會有很多排序操作,這並不是說我可以在某個程序中執行一次操作,並完成它。 :) – Redsandro

+0

什麼是你的數據結構,它是如何存儲的?你使用某種數據庫(這是我以前拼錯的「DBS」的意思)? – Bergi

回答

0
我們希望能夠到屬於一個人

然後孩子們進行排序

我會安排他們這樣的:

Marley Karla Wilma 
     Kasper Wonda 
     Kevin Wilma 
     Kyra Wonda 
Murphy Kara Winnie 
     Klaus Wendy 
     Klea Wendy 
     Kurt Winnie 

當然,因爲只有每個孩子一個母親沒有太大的區別,但是對於您的實際數據,這可能會有所不同。

然而,你已經可以看到現在,你只需要梳理各每人的kids陣列。因此,一般來說,不是將數據展平成一個大表格陣列,而是多列排序,然後根據您的建議對結果進行重新組合,您應該首先進行分組,然後對這些組進行排序 - 有點像bucket sort

var men = data["men"]; 
men.forEach(function (man) { 
    var kids = {}; 
    var wifes = man["wifes"]; 
    for (var i=0; i<wifes.length; i++) { 
     var wkids = wifes[i]["kids"]; 
     for (j=0; j<wkids.length; j++) { 
      var id = wkids[j]["name"]; 
      if (id in kids) { 
       kids[id].mothers.push(wifes[i]); 
      else { 
       kids[id] = wkids[i]; 
       kids[id].mothers = [ wifes[i] ]; 
      } 
     } 
    } 
    // if the id is the sort criteria: 
    man["kids"] = Object.keys(kids).sort().map(function(id) { 
     return kids[id]; 
    }); 
    // else build the array first and then sort it: 
    // man["kids"] = Object.values(kids).sort(function(kida, kidb) { 
    // <some kid comparison> 
    // }); 

    // you might integrate this loop in the above, but it's independent: 
    man["kids"].forEach(function(kid) { 
     kid["mothers"].sort(/* some mother comparison */); 
    }) 
}); 
// now every man has a sorted "kids" array with each kid having a sorted "mothers" array