#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)