将数据格式化为新结构javascript
我目前正在使用D3作为一个实验,我从一个API中以某种格式接收数据,但我需要将该数据重新构造为与D3一起工作的格式。下面是我正在接收的数据的一个示例将数据格式化为新结构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
{
"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;
}, []);