从连接查询中取消嵌套的嵌套数据

时间:2014-10-30 23:29:24

标签: javascript mysql

我有一系列嵌套对象,这些对象包含在由一对多关系表示的关系数据库中。

enter image description here

给定连接查询的结果集,例如以下,其中obj A包含许多B,而B又包含许多C,而C又包含许多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包含两个C,第二个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},{...}]

1 个答案:

答案 0 :(得分: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;
    }
}