Javascript 创建JSON对象的层次结构数组
我几乎完成了创建JSON格式对象的最终数组的JavaScript代码。 从源数组中,我创建了一个顶级父记录及其相应的子记录 我现在需要将其他记录推送到一个或多个子记录上。这就是我遇到麻烦的地方 这是我的目标数据,其中“id”:29是我的顶级节点。那么“children”数组如下所示:Javascript 创建JSON对象的层次结构数组,javascript,arrays,json,Javascript,Arrays,Json,我几乎完成了创建JSON格式对象的最终数组的JavaScript代码。 从源数组中,我创建了一个顶级父记录及其相应的子记录 我现在需要将其他记录推送到一个或多个子记录上。这就是我遇到麻烦的地方 这是我的目标数据,其中“id”:29是我的顶级节点。那么“children”数组如下所示: [ { "id": 29, "field0": "$ALL$", "field1": 1564.92711931719, "field2": -171.934775655824
[
{
"id": 29,
"field0": "$ALL$",
"field1": 1564.92711931719,
"field2": -171.934775655824,
"field3": -292.877167373888,
"children": [
{
"id": 0,
"field0": "Goldman",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 1,
"field0": "IBM",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 2,
"field0": "JP Chase",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 4,
"field0": "Merrill",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 5,
"field0": "Nokia",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 6,
"field0": "Pequot",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 9,
"field0": "Deutsche",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 16,
"field0": "General Insurance",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 18,
"field0": "AIG",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 19,
"field0": "Andor",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 20,
"field0": "BARCLAYS",
"field1": 92.7731197209214,
"field2": -10.1717767200607,
"field3": 616.369427825382
},
{
"id": 26,
"field0": "CSFB",
"field1": 3.35029024626419,
"field2": -0.367366071961442,
"field3": -132.725310207512
},
{
"id": 27,
"field0": "BLOSOFL",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 28,
"field0": "GRMOBND",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 32,
"field0": "GM",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 33,
"field0": "GE",
"field1": 0,
"field2": 0,
"field3": 0
},
{
"id": 34,
"field0": "BHPBMGRP",
"field1": 1468.80370935,
"field2": -161.395632863801,
"field3": -776.521284991759
},
{
"id": 35,
"field0": "PIMCO",
"field1": 0,
"field2": 0,
"field3": 0
}
]
}
]
我现在只剩下以下剩余的源数组,我需要在上面找到它的父记录
[
{
"id": 7,
"parent": 35,
"values": [
"Pimco Fund A",
0,
0,
0
]
},
{
"id": 15,
"parent": 0,
"values": [
"GSAM",
0,
0,
0
]
},
{
"id": 17,
"parent": 33,
"values": [
"Genworth",
0,
0,
0
]
},
{
"id": 21,
"parent": 30,
"values": [
"BHHSH",
0,
0,
0
]
},
{
"id": 22,
"parent": 30,
"values": [
"BHPBFIN",
0,
0,
0
]
},
{
"id": 23,
"parent": 31,
"values": [
"BHPSTEEUR",
1468.80370935,
-161.395632863801,
-776.521284991759
]
},
{
"id": 25,
"parent": 31,
"values": [
"BLUESCOPEFIN",
0,
0,
0
]
},
{
"id": 30,
"parent": 34,
"values": [
"BHPBGRP",
0,
0,
0
]
},
{
"id": 31,
"parent": 34,
"values": [
"BHPSTEELGRP",
1468.80370935,
-161.395632863801,
-776.521284991759
]
}
]
我可以使用下划线JS库查找“剩余”中的每个项目,但如何将它们推送到我的父[]数组中
更新:
下面是我的u.each()循环,它最终创建了子循环;然而,在我的剩余数组中仍然有一些错误,这些错误最终将成为子元素的子元素(n级层次结构)
我相信有一个更聪明的方法来实现这一点
var findPar;
_.each(rowsNew, function (row) {
// looks through parents array where id == row.parent
findPar = _.findWhere(parents[0].children, { id: row.parent });
if (findPar != undefined) {
if (findPar.children == undefined) {
findPar["children"] = createJsonFromSingleRow(row);
}
else {
findPar.children.push(createJsonFields(row));
}
rowsNew = _.reject(rowsNew, function (rec) { return rec.id == row.id; }); }
});
return newJson = parents;
提前感谢你的帮助
Bob如果使用id为
id的对象作为属性名而不是数组,那么这会变得简单一些。(您可以创建一个函数来从原始JSON对象执行此转换)
然后,您可以像这样将每个剩余内容添加到父散列中(使用纯JS,并假设您已经找到并使用类似的散列结构填充了剩余内容):
所以“key”会自动从剩余的内容中提取“id”字段?它不会提取id
字段,而是使用属性名,您必须将属性名设置为与id
相同。只要它是独一无二的,就可以了。
var findPar;
_.each(rowsNew, function (row) {
// looks through parents array where id == row.parent
findPar = _.findWhere(parents[0].children, { id: row.parent });
if (findPar != undefined) {
if (findPar.children == undefined) {
findPar["children"] = createJsonFromSingleRow(row);
}
else {
findPar.children.push(createJsonFields(row));
}
rowsNew = _.reject(rowsNew, function (rec) { return rec.id == row.id; }); }
});
return newJson = parents;
var hash = {
'29' : {
"id": 29,
"field0": "$ALL$",
"field1": 1564.92711931719,
"field2": -171.934775655824,
"field3": -292.877167373888,
"children": {
'0': {
"id": 0,
"field0": "Goldman",
"field1": 0,
"field2": 0,
"field3": 0
},
'1': {
"id": 1,
"field0": "IBM",
"field1": 0,
"field2": 0,
"field3": 0
},
...
'35': {
"id": 35,
"field0": "PIMCO",
"field1": 0,
"field2": 0,
"field3": 0
}
}
}
};
for( key in leftovers ){
if( leftovers.hasOwnProperty(key) ){
var parent = leftovers[key].parent;
// If parent doesn't exist, create it
if( !parent in hash ) {
hash[parent] = {
id: parent,
children: {}
};
}
// Create the children object if it doesn't exist
if( !hash[parent].children ) {
hash[parent].children = {};
}
// Copy the object from leftovers into the parent hash
// copyObj is custom and I didn't include it here.
hash[parent].children[key] = copyObj(leftovers[key]);
// Remove from leftovers, now that it's moved to the parent hash.
delete leftovers[key];
}
}