Преобразование объектов в многомерный массив

#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]
}