Javascript 从联接查询中取消设置嵌套数据

Javascript 从联接查询中取消设置嵌套数据,javascript,mysql,Javascript,Mysql,我有一系列嵌套对象,它们包含在一对多关系表示的关系数据库中 给定一个连接查询的结果集,如以下所示,其中obj a包含多个B,而B又包含多个C,C又包含多个D。以下是查询: 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 查询结果如下:

我有一系列嵌套对象,它们包含在一对多关系表示的关系数据库中

给定一个连接查询的结果集,如以下所示,其中obj a包含多个B,而B又包含多个C,C又包含多个D。以下是查询:

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中,最简单和最有效的方法是什么?请注意,最简单的方法可能涉及使用underline.js或lodash等库

数据已以如下形式返回:

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

我们就是这样做的:

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;
    }
}

就我个人而言,我没有看到输入和输出之间的关系。澄清将有所帮助