nodejs — преобразование одного объекта в несколько объектов

#node.js #object

Вопрос:

У меня есть одно возражение, которое я получил от клиента,

 const record = {
    "date":"2021-09-20",
    "startAt":"10:00",
    "endAt":"16:00",
    "employeeId": [5,2],<==
    "projectId":[50,48],<==
    "notes":"blahhh"
}
 

Я хочу преобразовать его в некоторые объекты, те же детали , но я хочу, чтобы, например
, EmployeeID 5 работал в двух проектах, 50 и 48
Я хочу иметь два объекта с одинаковыми деталями, но идентификатор сотрудника равен 50, а идентификатор проекта : первый объект с 50, а второй объект с 48

 {
    ....
    "employeeId": [5],<== //first emplyee
    "projectId":[50],<== // first project
    ....
}

{
    ....
    "employeeId": [5],//first emplyee
    "projectId":[48], // sec project
    ...
}

{
    ....
    "employeeId": [2],//sec employee
    "projectId":[50], //first project
    ....
}

{
    ....
    "employeeId": [2],//sec employee
    "projectId":[48], //sec project
    ....
}
 

спасибо, что помогли мне

Ответ №1:

Вы можете сделать, например:

 const record = {
  date: "2021-09-20",
  startAt: "10:00",
  endAt: "16:00",
  employeeId: [5, 2],
  projectId: [50, 48],
  notes: "blahhh",
};

const records = record.employeeId
  .map((employeeId) =>
    record.projectId.map((projectId) => ({
      ...record,
      employeeId: [employeeId],
      projectId: [projectId]
    }))
  )
  .flat();

console.log(records); 

Ответ №2:

1 — Извлеките все ключи, которые имеют значения массива

 let arrayKeys = Object.entries(record).filter(([key, value]) => typeof value === 'object' amp;amp; Array.isArray(value))
 

2 — Создайте свой объект по умолчанию с помощью ключей по умолчанию:

 let defaultObj = Object.entries(record).reduce((obj, [key, value]) => {
  if(!typeof value === 'object' || !Array.isArray(value)) {
    obj[key] = value
  }
  return obj;
}, {})
 

3 — Создайте функцию, которая рекурсивно заполнит массив вашими конечными объектами:

 function addKeys(array, obj, keys) {
  if(!keys.length) {
    array.push(obj);
    return;  
  }
  let [key, values] = keys.pop();
  values.forEach(val => {
    obj[key] = [val];
    addKeys(array, {...obj}, [...keys])
  });
}

 

Полный код:

 const record = {
    "date":"2021-09-20",
    "startAt":"10:00",
    "endAt":"16:00",
    "employeeId": [5,2],
    "projectId":[50,48, 60, 70],
    "notes":"blahhh",
    "extraArrayKey": ['a', 'b']
}

let arrayKeys = Object.entries(record).filter(([key, value]) => typeof value === 'object' amp;amp; Array.isArray(value))

let defaultObj = Object.entries(record).reduce((obj, [key, value]) => {
  if(!typeof value === 'object' || !Array.isArray(value)) {
    obj[key] = value
  }
  return obj;
}, {})

function addKeys(array, obj, keys) {
  if(!keys.length) {
    array.push(obj);
    return;  
  }
  let [key, values] = keys.pop();
  values.forEach(val => {
    obj[key] = [val];
    addKeys(array, {...obj}, [...keys])
  });
}

let output = [];

addKeys(output, defaultObj, arrayKeys)  

console.log(output)