我有一系列嵌套对象,这些对象包含在由一对多关系表示的关系数据库中。
给定连接查询的结果集,例如以下,其中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},{...}]
答案 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;
}
}