JavaScript извлечь совпадающие идентификаторы для массива объектов - PullRequest
0 голосов
/ 28 июня 2018

У меня есть массив объектов, содержащих employeeProjectId , которые могут быть одинаковыми. Итак, что я ищу, так это то, что если существует несколько одинаковых employeeProjectId, то объедините результаты в один объект с projectRoles в виде массива. Ответ приведен ниже для справки. Спасибо:)

{
"code": 200,
"success": true,
"message": "Successfully completed",
"data": [
    {
        "employeeProjectId": 1,
        "projectRoleId": 1,
        "employee_project": {
            "id": 1,
            "status": true,
            "type": "backup",
            "startDate": "2018-06-28T07:20:36.000Z",
            "endDate": "2018-06-29T07:20:39.000Z",
            "allocation": 100,
            "employeeId": 326,
            "projectId": 35,
            "employee": {
                "firstName": "Asad",
                "lastName": "Marfani"
            },
            "project": {
                "name": "RTA"
            }
        },
        "project_role": {
            "id": 1,
            "role": "front_end_ios"
        }
    },
    {
        "employeeProjectId": 1,
        "projectRoleId": 2,
        "employee_project": {
            "id": 1,
            "status": true,
            "type": "backup",
            "startDate": "2018-06-28T07:20:36.000Z",
            "endDate": "2018-06-29T07:20:39.000Z",
            "allocation": 100,
            "employeeId": 326,
            "projectId": 35,
            "employee": {
                "firstName": "Asad",
                "lastName": "Marfani"
            },
            "project": {
                "name": "RTA"
            }
        },
        "project_role": {
            "id": 2,
            "role": "Front End - Android"
        }
    },
    {
        "employeeProjectId": 3,
        "projectRoleId": 1,
        "employee_project": {
            "id": 3,
            "status": true,
            "type": "backup",
            "startDate": "2018-06-28T07:47:19.000Z",
            "endDate": "2018-06-29T07:47:22.000Z",
            "allocation": 50,
            "employeeId": 16,
            "projectId": 35,
            "employee": {
                "firstName": "Nosheen",
                "lastName": "Sikandar"
            },
            "project": {
                "name": "RTA"
            }
        },
        "project_role": {
            "id": 1,
            "role": "front_end_ios"
        }
    },
    {
        "employeeProjectId": 3,
        "projectRoleId": 3,
        "employee_project": {
            "id": 3,
            "status": true,
            "type": "backup",
            "startDate": "2018-06-28T07:47:19.000Z",
            "endDate": "2018-06-29T07:47:22.000Z",
            "allocation": 50,
            "employeeId": 16,
            "projectId": 35,
            "employee": {
                "firstName": "Nosheen",
                "lastName": "Sikandar"
            },
            "project": {
                "name": "RTA"
            }
        },
        "project_role": {
            "id": 3,
            "role": "Front End - Web"
        }
    }
]}

Я хочу это так:

{
"code": 200,
"success": true,
"message": "Successfully completed",
"data": [
    {
        "employeeProjectId": 1,
        "employee_project": {
            "id": 1,
            "status": true,
            "type": "backup",
            "startDate": "2018-06-28T07:20:36.000Z",
            "endDate": "2018-06-29T07:20:39.000Z",
            "allocation": 100,
            "employeeId": 326,
            "projectId": 35,
            "employee": {
                "firstName": "Asad",
                "lastName": "Marfani"
            },
            "project": {
                "name": "RTA"
            }
        },
        "project_role": [
            {
                "id": 1,
                "role": "front_end_ios",
             },
             {
                "id": 2,
                "role": "front_end_web"
             }
        ]
    }
]}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я думаю, вы ищете что-то вроде этого: D

иначе вы также можете использовать модуль lodash.

    const obj = {
    "code": 200,
    "success": true,
    "message": "Successfully completed",
    "data": [
        {
            "employeeProjectId": 1,
            "projectRoleId": 1,
            "employee_project": {
                "id": 1,
                "status": true,
                "type": "backup",
                "startDate": "2018-06-28T07:20:36.000Z",
                "endDate": "2018-06-29T07:20:39.000Z",
                "allocation": 100,
                "employeeId": 326,
                "projectId": 35,
                "employee": {
                    "firstName": "Asad",
                    "lastName": "Marfani"
                },
                "project": {
                    "name": "RTA"
                }
            },
            "project_role": {
                "id": 1,
                "role": "front_end_ios"
            }
        },
        {
            "employeeProjectId": 1,
            "projectRoleId": 2,
            "employee_project": {
                "id": 1,
                "status": true,
                "type": "backup",
                "startDate": "2018-06-28T07:20:36.000Z",
                "endDate": "2018-06-29T07:20:39.000Z",
                "allocation": 100,
                "employeeId": 326,
                "projectId": 35,
                "employee": {
                    "firstName": "Asad",
                    "lastName": "Marfani"
                },
                "project": {
                    "name": "RTA"
                }
            },
            "project_role": {
                "id": 2,
                "role": "Front End - Android"
            }
        },
        {
            "employeeProjectId": 3,
            "projectRoleId": 1,
            "employee_project": {
                "id": 3,
                "status": true,
                "type": "backup",
                "startDate": "2018-06-28T07:47:19.000Z",
                "endDate": "2018-06-29T07:47:22.000Z",
                "allocation": 50,
                "employeeId": 16,
                "projectId": 35,
                "employee": {
                    "firstName": "Nosheen",
                    "lastName": "Sikandar"
                },
                "project": {
                    "name": "RTA"
                }
            },
            "project_role": {
                "id": 1,
                "role": "front_end_ios"
            }
        },
        {
            "employeeProjectId": 3,
            "projectRoleId": 3,
            "employee_project": {
                "id": 3,
                "status": true,
                "type": "backup",
                "startDate": "2018-06-28T07:47:19.000Z",
                "endDate": "2018-06-29T07:47:22.000Z",
                "allocation": 50,
                "employeeId": 16,
                "projectId": 35,
                "employee": {
                    "firstName": "Nosheen",
                    "lastName": "Sikandar"
                },
                "project": {
                    "name": "RTA"
                }
            },
            "project_role": {
                "id": 3,
                "role": "Front End - Web"
            }
        }
    ]}
    
    const data = obj.data
    const res = data.filter(emp => {
    	return emp.employee_project.id == "1"
    }).reduce(item => {
    	return item
    })
    
    console.log(res)
0 голосов
/ 28 июня 2018

Вы можете использовать map для создания массива групп (employeeProjectIds) и сокращения массива на группы, используя этот массив.

У меня такое чувство, что поля в employee_project также необходимо объединить, поскольку начало, дата окончания и распределение являются уникальными для сотрудника и проекта.

Затем сопоставьте массив групп в объединенных данных:

const data = [{"employeeProjectId":1,"project_role":"a"},{"employeeProjectId":1,"project_role":"b"},{"employeeProjectId":3,"project_role":"a"},{"employeeProjectId":3,"project_role":"c"}];
const groupBy = (getGroup,array) => {
  //use getGroup function to get the group identifyer of the items (is employeeProjectId)
  const groups = array.map(getGroup);
  return array.reduce(//reduce array into array of arrays that are grouped
    (result,item,index)=>{
      //get the group of current item
      const itemGroup = getGroup(item);
      //find the index of this item in groups
      const indexOfGroup = groups.indexOf(itemGroup);
      //index of this item in groups is current index so it's first item of the group
      if(indexOfGroup===index){
        return result.concat([[item]])
      }
      //it is not first item of the group, add this item to it's correct group
      //add current item to the right group
      result.find(([item])=>getGroup(item)===itemGroup).push(item);
      return result;
    },
    []//initial result
  )
}

const merge = (item1,item2) => {
  //if project_role is not an array yet, make it an array
  if(!Array.isArray(item1.project_role)){
    item1 = {...item1,project_role:[item1.project_role]};
  }
  //add project_role of item2 to item1
  item1.project_role.push(item2.project_role);
  return item1;
};

const grouped = groupBy(x=>x.employeeProjectId,data);
console.log("grouped",grouped);

console.log(
  "grouped and merged",
  groupBy(x=>x.employeeProjectId,data).map(
    group=>
      group.reduce(merge)
  )
)

Может существовать некоторый синтаксис, с которым вы не знакомы, например распространение в литералах объекта для копирования объекта (не глубокого копирования), функции стрелок и деструктурирующее назначение используется при попытке найти элемент в массиве.

Методы карт и сокращения документированы здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...