Javascript 创建JSON对象的层次结构数组

Javascript 创建JSON对象的层次结构数组,javascript,arrays,json,Javascript,Arrays,Json,我几乎完成了创建JSON格式对象的最终数组的JavaScript代码。 从源数组中,我创建了一个顶级父记录及其相应的子记录 我现在需要将其他记录推送到一个或多个子记录上。这就是我遇到麻烦的地方 这是我的目标数据,其中“id”:29是我的顶级节点。那么“children”数组如下所示: [ { "id": 29, "field0": "$ALL$", "field1": 1564.92711931719, "field2": -171.934775655824

我几乎完成了创建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
    ]
}
]

我可以使用下划线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];
  }
}