将数据格式化为新结构javascript

将数据格式化为新结构javascript,javascript,d3.js,Javascript,D3.js,我目前正在使用D3作为一个实验,我从一个API中以某种格式接收数据,但我需要将该数据重新构造为与D3一起工作的格式。下面是我正在接收的数据的一个示例 { "user_id": 3, "service_user": "Phillippa", "staff_name": "Abbey", "role": "A", "staff_id": 2, "status": "P", "workbase": "Workbase 1" }, { "u

我目前正在使用D3作为一个实验,我从一个API中以某种格式接收数据,但我需要将该数据重新构造为与D3一起工作的格式。下面是我正在接收的数据的一个示例

{
    "user_id": 3,
    "service_user": "Phillippa",
    "staff_name": "Abbey",
    "role": "A",
    "staff_id": 2,
    "status": "P",
    "workbase": "Workbase 1"
},
{
    "user_id": 60,
    "service_user": "Raymond",
    "staff_name": "Adam",
    "role": "D",
    "staff_id": 8,
    "status": "C",
    "workbase": "Workbase 2"
},
{
    "user_id": 63,
    "service_user": "Alison",
    "staff_name": "Adam",
    "role": "D",
    "staff_id": 8,
    "status": "C",
    "workbase": "Workbase 2"
},
{
    "user_id": 68,
    "service_user": "Philippa",
    "staff_name": "Adam",
    "role": "C",
    "staff_id": 9,
    "status": "C",
    "workbase": "Workbase 2"
},
{
    "user_id": 57,
    "service_user": "Philip",
    "staff_name": "Adam",
    "role": "W",
    "staff_id": 9,
    "status": "C",
    "workbase": "Workbase 2"
}
D3预期的结构如下:

{
    "name":"flare",
    "children":[
        {
            "name":"analytics",
            "children":[
                {
                    "name":"cluster",
                    "children":[
                        {
                            "name":"AgglomerativeCluster",
                            "size":3938
                        },
                        {
                            "name":"CommunityStructure",
                            "size":3812
                        },
                        {
                            "name":"HierarchicalCluster",
                            "size":6714
                        },
                        {
                            "name":"MergeEdge",
                            "size":743
                        }
                    ]
                },
                {
                    "name":"graph",
                    "children":[
                        {
                            "name":"BetweennessCentrality",
                            "size":3534
                        },
                        {
                            "name":"LinkDistance",
                            "size":5731
                        },
                        {
                            "name":"MaxFlowMinCut",
                            "size":7840
                        },
                        {
                            "name":"ShortestPaths",
                            "size":5914
                        },
                        {
                            "name":"SpanningTree",
                            "size":3416
                        }
                    ]
                },
                {
                    "name":"optimization",
                    "children":[
                        {
                            "name":"AspectRatioBanker",
                            "size":7074
                        }
                    ]
                }
            ]
        }
    ]
}
所以我需要使用接收到的数据来生成一个新的结构,它基本上是带有子数组的对象

第一个结构的工作方式是Workbase 1有一个子“Abbey”,而“Abbey”又有一个子“Phillipa”,现在可能Workbase 1在返回的数据中出现了很多次,所以它只需要推送到Workbase 1特定的对象中

Workbase 2稍微复杂一些,Workbase 2有一个孩子“Adam”,而“Adam”有4个孩子“Raymond”、“Allison”、“Phillipa”和“Phillip”

理论上数据应该是这样的

{
    "name":"Workbase 1",
    "children":[
        {
            "name":"Abbey",
            "children":[
                {
                    "name":"Phillipa"
                }
            ]
        }
    ]
},
{
    "name":"Workbase 2",
    "children":[
        {
            "name":"Adam",
            "children":[
                {
                    "name":"Raymond"
                },
                {
                    "name":"Allison"
                },
                {
                    "name":"Phillipa"
                },
                {
                    "name":"Phillip"
                }
            ]
        }
    ]
}
到目前为止,我正在遍历对象并确保只获得唯一的工作基础

original_data.forEach(function(j){
    if(_.indexOf(workbases, j.workbase) < 0) {
        workbases.push(j.workbase);

        data.push({
            name : j.workbase,
            children : []
        });
    }
});
原始数据forEach(函数(j){ if(u.indexOf(workbase,j.workbase)<0){ 工作台。推(j.工作台); 数据推送({ 姓名:j.workbase, 儿童:[] }); } });
从这一点上说,我无法将正确的子项和子项放入正确的工作库,有什么想法吗?

您可以使用一种嵌套的方法,为名称创建一个哈希表

var data=[{“用户id”:3,“服务用户”:“菲利普”,“员工姓名”:“阿比”,“角色”:“A”,“员工id”:2,“状态”:“P”,“工作基地”:“工作基地1”},{“用户id”:60,“服务用户”:“雷蒙德”,“员工姓名”:“亚当”,“角色”:“D”,“员工id”:8,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:63,“服务用户”:“艾莉森”,“员工姓名”:“Adam”,“角色”:“D”,“员工id”:8,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:68,“服务用户”:“Philippa”,“员工姓名”:“Adam”,“角色”:“C”,“员工id”:9,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:57,“服务用户”:“Philip”,“员工姓名”:“Adam”,“角色”:“W”,“员工id”:9,“状态”:“C”,“工作基地”:“Workbase 2”}],
结果=[];
data.forEach(函数(a){
var检查=功能(键、目标){
如果(!此[键]){
此[key]={name:key,子项:[]};
target.push(此[键]);
}
}.约束(本);
检查(a.工作基础、结果);
选中(a.staff\u name,此[a.workbase].children);
这是[a.staff\u name].children.push({name:a.service\u user});
},Object.create(null));
console.log(结果);

。作为控制台包装{max height:100%!important;top:0;}
您可以使用一种嵌套方法,并为名称提供一个哈希表

var data=[{“用户id”:3,“服务用户”:“菲利普”,“员工姓名”:“阿比”,“角色”:“A”,“员工id”:2,“状态”:“P”,“工作基地”:“工作基地1”},{“用户id”:60,“服务用户”:“雷蒙德”,“员工姓名”:“亚当”,“角色”:“D”,“员工id”:8,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:63,“服务用户”:“艾莉森”,“员工姓名”:“:“Adam”,“角色”:“D”,“员工id”:8,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:68,“服务用户”:“Philippa”,“员工姓名”:“Adam”,“角色”:“C”,“员工id”:9,“状态”:“C”,“工作基地”:“工作基地2”},{“用户id”:57,“服务用户”:“Philip”,“员工姓名”:“Adam”,“角色”:“W”,“员工id”:9,“状态”:“C”,“工作基地”:”“Workbase 2”}],
结果=[];
data.forEach(函数(a){
var检查=功能(键、目标){
如果(!此[键]){
此[key]={name:key,子项:[]};
target.push(此[键]);
}
}.约束(本);
检查(a.工作基础、结果);
选中(a.staff\u name,此[a.workbase].children);
这是[a.staff\u name].children.push({name:a.service\u user});
},Object.create(null));
console.log(结果);

.as console wrapper{max height:100%!important;top:0;}
数据的哪一部分决定了什么是子数据,什么是父数据?即Abbey和Phillipa之间的关系,或者Adam和Raymond、Allison、Phillipa、Phillipa之间的关系。您的第一个和第三个数据样本的格式无效。我假设每个样本都应该包装在一个数组中(方括号;
[]
)数据的哪一部分决定了什么是孩子,什么是父母?即Abbey和Phillipa,或者Adam和Raymond,Allison,Phillipa,Phillipa之间的关系您的第一个和第三个数据样本的格式无效。我假设每个样本都应该包装在一个数组中(方括号;
[]
let sorted = original_data.reduce((acc, cur) => {
  /* check if the workbase is already in the array */
  let wb = acc.find(wb => wb.name === cur.workbase);
  if (wb) {
    /* check if staff by that name is already in this workbase */
    let staff = wb.children.find(staff => staff.name === cur.staff_name);
    if (staff) {
      staff.children.push({name: cur.service_user});
    } else {
      /* if not, instantiate this staff in the array */
      wb.push({
        name: cur.staff_name,
        children: [{name: cur.service_user}]
      });
    }
  } else {
    /* if not, instantiate this workbase in the array */
    acc.push({
      name: cur.workbase,
      children: [
        {
          name: cur.staff_name,
          children: [{name: cur.service_user}]
        }
      ]
    });
  }
  return acc;
}, []);