创建JSON对象的层次结构数组
Creating a hierarchy array of JSON objects
我几乎完成了创建JSON格式对象的最后一个数组的JavaScript代码。从我的源数组中,我创建了一个顶级父记录及其相应的子记录。
我现在需要将其他记录推送到一个或多个子记录上。这就是我遇到麻烦的地方。
这是我的目标数据,其中"id":29是我的顶级节点。然后"children"数组落在下面:
[
{
"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
]
}
]
我可以使用UndercoreJS库来定位"剩余"中的每个项目,但如何将它们推送到我的parent[]数组中?
更新:
这是我的_.each()循环,它最终创建了孩子;然而,在我剩下的数组中,我仍然有一些走样,它们最终基本上会成为孩子的孩子(n级层次结构)
findPar["children"] = thisChild[0];
我相信有一种更聪明的方法可以做到这一点。
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
作为属性名称的对象而不是数组,这会变得简单一些。(您可以创建一个函数来从原始JSON对象进行转换)
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
}
}
}
};
然后,您可以像这样将每个剩余部分添加到父散列中(使用纯JS,并假设您已经找到并填充了具有类似散列结构的剩余部分):
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];
}
}
相关文章:
- 如何在javascript中使用2个一维数组创建层次结构树
- 展平多个嵌套层次结构数组-d3.js
- $.when.apply 根据输入数组的长度返回具有不同结构的结果
- JavaScript-我可以用for循环中修改的属性将新结构推送到数组中吗
- 用Javascript从两个平面结构数组中格式化JSON
- 什么'最合适的数据结构是什么?(使用一个有间隙的数组是否存在缺点或注意事项?)
- 以数组为数据结构的d3.js树布局
- 遍历JS对象/数组,如果找到匹配项,则更改值并返回原始对象/数组结构
- 在JavaScript性能方面模拟结构处理的C数组
- 如何合并数组以获取结构
- 如何将 JSON 数组反序列化为本机 .net 数据结构
- 如何从平面JavaScript数组创建分层HTML结构
- 设置对象数据结构数组属性
- 按层次结构和名称对具有层次结构的对象数组进行排序
- 创建JSON对象的层次结构数组
- 带子数组-以父子层次结构的形式显示它
- JavaScript -结构数组
- N级层次结构数组Angular JS
- Javascript:将一个结构数组拆分为其元素数组
- 将复杂的层次结构推送到可观察数组中会创建重复的实例