Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular.js按子属性分组_Javascript_Angularjs_Json_Loops - Fatal编程技术网

Javascript Angular.js按子属性分组

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"

我有这样的JSON文件:

{
"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();