2014-10-30 65 views
0

我有一系列嵌套對象,它們包含在由一對多關係表示的關係數據庫中。來自聯接查詢的unflatten嵌套數據

enter image description here

給定來自連接查詢集,例如一個結果,其中的obj A包含許多BS的又包含許多銫又包含許多Ds的下面。下面是該查詢:是

SELECT A_ID AS A, B_ID AS B, C_ID AS C, D_ID AS D FROM A 
INNER JOIN B on B.A_ID = A.A_ID 
INNER JOIN C ON C.B_ID = B.B_ID 
INNER JOIN D ON D.C_ID = C.C_ID 

此查詢的結果如下:

| A | B | C | D | 
|---|---|---|---| 
| 1 | 1 | 1 | 1 | 
| 1 | 1 | 2 | 2 | 
| 1 | 2 | 3 | 3 | 
| 1 | 2 | 3 | 4 | 

我想產生這樣一個JSON對象。請注意,只有一個A對象,由於內部連接,每行中的數據都是相同的。 A對象包含兩個B對象。第一個B包含兩個Cs,第二個B包含一個包含兩個D的C。只有唯一的數據真的是d,但是每一行都包含從層次結構中的所有數據:

{ 
    "A": { 
    "A_id": 1, 
    "Bs": [{ 
     "B_id": 1, 
     "Cs": [{ 
      "C_id": 1, 
      "Ds": [{ 
       "D_id": 1 
       }] 
      },{ 
      "C_id": 2, 
      "Ds": [{ 
       "D_id": 2 
       }] 
      }] 
     },{ 
     "B_id": 2, 
     "Cs": [{ 
      "C_id": 3, 
      "Ds": [{ 
       "D_id": 3 
       },{ 
       "D_id": 4 
       }] 
      }] 
     }] 
    } 
} 

什麼是JavaScript來做到這一點最簡單,最有效的方法是什麼?請注意,最簡單的方法可能涉及使用諸如underscore.js或lodash之類的庫。

數據已經回來的形式,如:

[{A_id:1, B_id:1, C_id:1, D_id:1},{...}] 
+0

個人,我沒有看到輸入和輸出之間的關係。澄清會有所幫助 – charlietfl 2014-10-30 23:45:48

回答

0

所以這是我們如何走近它:

var A = { Bs: []}; 
var Bs = {}; 
var Cs = {}; 
var Ds = {}; 

_.each(results, function(r) { 
    var B = Bs[r.B_ID]; 
    if(!B) { 
     B = {id: r.B_ID, Cs:[]}; 
     A.Bs.push(B); 
     B[r.B_ID] = B; 
    } 
    var C = Cs[r.C_ID]; 
    if(!C) { 
     C = {id: r.C_ID, D:[]}; 
     B.Cs.push(C); 
     Cs[r.C_ID] = C; 
    } 
    var D = Ds[r.D_ID]; 
    if(!D) { 
     D = {id: r.D_ID}; 
     C.Ds.push(D); 
     Ds[r.D_ID] = D; 
    } 
}