Как создать новый массив вложенных объектов из существующего массива объектов

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Пожалуйста, помогите реструктурировать объект в js.

 const o = [
  {
    id: 1612,
    Tasks: 'Remuneration sheet mentain.',
    calendar_year: 2021,
    calendar_week_in_year: 45,
    WeekStartDate: '2021-10-31',
    WeekEndDate: '2021-11-06',
    status: 'Done',
  },
  {
    id: 1612,
    Tasks: 'Remuneration sheet mentain.',
    calendar_year: 2021,
    calendar_week_in_year: 46,
    WeekStartDate: '2021-11-28',
    WeekEndDate: '2021-12-04',
    status: 'Done',
  },
  {
    id: 1939,
    Tasks: 'Debtors Reconciliation',
    calendar_year: 2021,
    calendar_week_in_year: 45,
    WeekStartDate: '2021-10-31',
    WeekEndDate: '2021-11-06',
    status: 'Done',
  },
  {
    id: 1939,
    Tasks: 'Debtors Reconciliation',
    calendar_year: 2021,
    calendar_week_in_year: 46,
    WeekStartDate: '2021-11-28',
    WeekEndDate: '2021-12-04',
    status: 'Done',
  },
];

 
 const required = [
  {
    id: 1612,
    Tasks: 'Remuneration sheet mentain.',
    week: [
      { w_no: 45, calendar_year: 2021, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done' },
      { w_no: 46, calendar_year: 2021, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done' },
    ],
  },
  {
    id: 1939,
    Tasks: 'Debtors Reconciliation',
    week: [
      { w_no: 45, calendar_year: 2021, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done' },
      { w_no: 46, calendar_year: 2021, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done' },
    ],
  },
];

 

Комментарии:

1. реструктурировать в какой формат? Кроме того, вам нужно показать свой уровень понимания, попытавшись найти решение и показать это. Кроме того, пожалуйста, отформатируйте свой код в своем вопросе.

Ответ №1:

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

 const o = [{ id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', },];

const result = Object.values(
  o.reduce((a, { id, Tasks, ...week }) => {
    (a[id] ??= { id, Tasks, week: [] }).week.push(week);

    return a;
  }, {})
);

console.log(result); 

В приведенном выше примере используется логическое присваивание с нулевым значением (??=) если вам нужно заменить его по соображениям совместимости, вы можете использовать короткое замыкание ИЛИ

 (a[id] || (a[id] = { id, Tasks, week: [] })).week.push(week);
 
 const o = [{ id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', },];

const result = Object.values(
  o.reduce((a, { id, Tasks, ...week }) => {
    (a[id] || (a[id] = { id, Tasks, week: [] })).week.push(week);

    return a;
  }, {})
);

console.log(result); 

Но удобство чтения лучше, чем компактность, поэтому вы также можете записать его полностью

 if (a[id] === undefined) {
  a[id] = { id, Tasks, week: [] };
}
    
a[id].week.push(week);
 
 const o = [{ id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1612, Tasks: 'Remuneration sheet mentain.', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 45, WeekStartDate: '2021-10-31', WeekEndDate: '2021-11-06', status: 'Done', }, { id: 1939, Tasks: 'Debtors Reconciliation', calendar_year: 2021, calendar_week_in_year: 46, WeekStartDate: '2021-11-28', WeekEndDate: '2021-12-04', status: 'Done', },];

const result = Object.values(
  o.reduce((a, { id, Tasks, ...week }) => {
    if (a[id] === undefined) {
      a[id] = { id, Tasks, week: [] };
    }
    
    a[id].week.push(week);

    return a;
  }, {})
);

console.log(result); 

Комментарии:

1. Он работает правильно. Спасибо.

2. Но не могу понять, как работает оператор ??= . Этот оператор получает пространство между ними в среде разработки vs code. Как это остановить? Пожалуйста, напишите.