根据AngularJS中的复杂对象分组

根据AngularJS中的复杂对象分组,angularjs,arrays,json,sorting,Angularjs,Arrays,Json,Sorting,我有一个包含员工任务分配的数组,它看起来像这样: $scope.assignments = [ { employee: { id:"1", firstname:"John", lastname:"Rambo" }, task: { name:"Kill everyone", project:"Destruction" }, date: { day:"01/01", year:"1

我有一个包含员工任务分配的数组,它看起来像这样:

$scope.assignments = [
    { 
      employee: {
        id:"1", firstname:"John", lastname:"Rambo"
      },
      task: {
        name:"Kill everyone", project:"Destruction"
      },
      date: {
        day:"01/01", year:"1985"
      }
    },
    {
      employee: {
        id:"2", firstname:"Luke", lastname:"Skywalker"
      },
      task: {
        name:"Find daddy", project:"Star Wars"
      },
      date: {
        day:"65/45", year:"1000000"
      }        
    },
    {
      employee: {
        id:"1", firstname:"John", lastname:"Rambo"
      },
      task: {
        name:"Save the world", project:"Destruction"
      },
      date: {
        day:"02/01", year:"1985"
      }
    }
];
$scope.assignmentsByEmployee = [
    { //First item
      id:"1", 
      firstname:"John",
      lastname:"Rambo",
      missions: [
        {
          name:"Kill everyone",
          date:"01/01",
          year:"1985"
        },
        {
          name:"Save the world",
          date:"02/01",
          year:"1985"
        }
      ]
    },
    { //Second item
      id="2",
      firstname:"Luke",
      lastname:"Skywalker",
      missions: [
        name:"Find daddy",
          date:"65/45",
          year:"1000000"         
      ]
   }
];
我想按员工分组,因为有这样的内容:

$scope.assignments = [
    { 
      employee: {
        id:"1", firstname:"John", lastname:"Rambo"
      },
      task: {
        name:"Kill everyone", project:"Destruction"
      },
      date: {
        day:"01/01", year:"1985"
      }
    },
    {
      employee: {
        id:"2", firstname:"Luke", lastname:"Skywalker"
      },
      task: {
        name:"Find daddy", project:"Star Wars"
      },
      date: {
        day:"65/45", year:"1000000"
      }        
    },
    {
      employee: {
        id:"1", firstname:"John", lastname:"Rambo"
      },
      task: {
        name:"Save the world", project:"Destruction"
      },
      date: {
        day:"02/01", year:"1985"
      }
    }
];
$scope.assignmentsByEmployee = [
    { //First item
      id:"1", 
      firstname:"John",
      lastname:"Rambo",
      missions: [
        {
          name:"Kill everyone",
          date:"01/01",
          year:"1985"
        },
        {
          name:"Save the world",
          date:"02/01",
          year:"1985"
        }
      ]
    },
    { //Second item
      id="2",
      firstname:"Luke",
      lastname:"Skywalker",
      missions: [
        name:"Find daddy",
          date:"65/45",
          year:"1000000"         
      ]
   }
];
他们的方法简单吗?我试着用双
forEach
做些什么,但结果一无所获

希望我能理解:)


谢谢

您应该能够在assignments数组中循环,并在员工ID上创建一个“keyed数组”(这仅仅意味着使用JavaScript中的对象)。然后您只需根据需要填充missions数组即可

差不多

// initialise a holding object
var assignmentsByEmployee = {};

// loop through all assignemnts
for(var i = 0; i < $scope.assignments.length; i++) {
    // grab current assignment
    var currentAssignment = $scope.assignments[i];
    // grab current id
    var currentId = currentAssignment.employee.id;

    // check if we have seen this employee before
    if(assignmentsByEmployee[currentId] === undefined) {
        // we haven't, so add a new object to the array
        assignmentsByEmployee[currentId] = {
            id: currentId,
            firstname: currentAssignment.employee.firstname,
            lastname: currentAssignment.employee.lastname,
            missions: []
        };
    }

    // we know the employee exists at this point, so simply add the mission details
    assignmentsByEmployee[currentId].missions.push({
        name: currentAssignment.task.name,
        date: currentAssignment.date.day,
        year: currentAssignment.date.year
    });
}