#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. Как это остановить? Пожалуйста, напишите.