#javascript #arrays #excel #javascript-objects
Вопрос:
У меня есть объект с количеством часов, потраченных на каждую неделю:
{
Week 46: {
"Other": 1
"Planner": 4
"Developer": 3
},
Week 47: {
"Planner": 4.5
"Developer": 2
},
Week 48: {
"Project Manager": 3
"Other": 2
}
}
Чего я хочу добиться, так это создать многомерный массив этого, с ролями в качестве первой строки и неделями в качестве столбцов. Значения часов должны быть заполнены до соответствующей недели. Структура образца ниже:
[["Role", "Week 46", "Week 47"],
["Planner", 4, 4.5],
["Other", 1, 0],
["Developer", 3, 2]]
Проблема, с которой я сталкиваюсь, заключается в том, что не все роли будут существовать во все недели, но чтобы исправить столбцы, мне каким-то образом нужно заполнить эти недели 0
.
Причина, по которой я конвертирую массив md, заключается в том, что я могу позже заполнить его в электронную таблицу.
Я пробовал ниже перебирать элементы, но я не могу понять, как логика сводится к тому, чтобы получить индекс массива к соответствующей неделе..
function createDataFrame(data) {
let i, j = 0;
let arr = [['Role']];
for (const [key, value] of Object.entries(data)) {
arr[0].push(`Week ${key}`);
console.log(arr);
if (data[key]) {
for (const [role, hours] of Object.entries(data[key])) {
let row = [role, hours]
arr.push(row);
}
}
i ;
}
Ответ №1:
сначала преобразуйте свои данные в объект с ролями в качестве ключей:
{
"Other": {
"Week 46": 1,
"Week 48": 2
},
"Planner": {
"Week 46": 4,
"Week 47": 4.5
},
"Developer": {
"Week 46": 3,
"Week 47": 2
},
"Project Manager": {
"Week 48": 3
}
}
затем преобразуйте в массив.
function createDataFrame(data) {
const weeks = Object.keys(data)
const rData = Object.entries(data).reduce((result, [week, roles]) =>
Object.entries(roles).reduce((acc, [role, hour]) =>
({...acc, [role]: { ...acc[role], [week]: hour}})
, result)
, {})
const lines = Object.entries(rData).map(([role, roleWeeks]) => {
const line = [role, ...new Array(weeks.length).fill(0)];
return Object.entries(roleWeeks).reduce((acc, [week, hour])=> {
acc[weeks.indexOf(week) 1] = hour
return acc
}, line)
})
return [['Roles', ...weeks], ...lines]
}