Javascript Angular.js按子属性分组
我有这样的JSON文件:Javascript Angular.js按子属性分组,javascript,angularjs,json,loops,Javascript,Angularjs,Json,Loops,我有这样的JSON文件: { "dates": [ { "day": "Monday", "shifts": [ { "shift-name": "shift 1", "assignments": [ { "position-name": "supervisor", "location-name"
{
"dates":
[
{
"day": "Monday",
"shifts": [
{
"shift-name": "shift 1",
"assignments": [
{
"position-name": "supervisor",
"location-name": "Location 2",
"persons": [
{
"person-name": "USI, ANTHONY RN"
}
]
},
{
"position-name": "driver(s?)",
"location-name": "LOCATION 1",
"persons": [
{
"person-name": "LOVELAND, VIVIENNEW"
},
{
"person-name": "LOVELAND, VIVIENNEW"
}
]
}...
我需要使用这个JSON创建一个循环。但我需要让所有人都按地点名称分组。但我不知道怎么做,因为位置名称可能会重复。所以结构应该是这样的:
Date
Location1
Shift1
Supervisors
Drivers
Shift2
Supervisors
Drivers
Location2
Shift1
Supervisors
Drivers
Shift2
Supervisors
Drivers
谢谢大家! 您需要将此数据映射到一个新的更平坦的结构,该结构表示您想要使用它的目的 一般来说,最好的方法是创建一个使用公共值作为键的临时对象。然后根据这些键将项目推送到数组 因此,首先要迭代
日期
在日期的每次迭代中创建一个空对象
然后,您将循环使用位置名称
值作为键创建对象键
该对象看起来像:
{
"Location 1":{"supervisors":[], "drivers":[]},
"Location 2":{"supervisors":[], "drivers":[]}
}
然后,在迭代persons
时,使用的“position name”
确定要推送到哪个数组。这一步看起来像:
{
"Location 1":{"supervisors":[], "drivers":[]},
"Location 2":{"supervisors":[], "drivers":[]}
}
最后,您迭代该对象以创建该日期位置所需的数组,dates循环将在下一次迭代中继续并重复该过程,例如,我使用您的结构获取abstract test.json文件。并获取数据表单XmlHttpRequest:
var xhr = new XMLHttpRequest();
xhr.open("GET", 'test.json', true);
xhr.onload = function(){
// get result
var data = JSON.parse(xhr.responseText);
// result
var result = {};
// go loop!
data.dates.forEach(function(day){
// check if day exists
result[day.day] = result[day.day] || {};
day.shifts.forEach(function(shift){
shift.assignments.forEach(function(assignment){
//check if location exists
result[day.day][assignment['location-name']] = result[day.day][assignment['location-name']] || {};
// ... if shift exists in this location
result[day.day][assignment['location-name']][shift['shift-name']] = result[day.day][assignment['location-name']][shift['shift-name']] || {};
// ... if position-name exists in this location -> shift
result[day.day][assignment['location-name']][shift['shift-name']][assignment['position-name']] = result[day.day][assignment['location-name']][shift['shift-name']][assignment['position-name']] || [];
// ... push persions in position-name array
assignment.persons.forEach(function(person){
result[day.day][assignment['location-name']][shift['shift-name']][assignment['position-name']].push(person);
})
});
});
});
// print result
console.log(result)
};
xhr.send();