Merge an array with a 2d array to an array of objects, with the keys are the elements of the 1d array

I have 2 arrays like this

const dates = ["2019", "2020", "2021"];
const data = [[100, 200, 300, 20], [400, 500, 600, 30], [700, 800, 900, 40]];

I want to merge these 2 arrays into an array of objects like this Details: The first object of the result array will have the values of the first element of each array in the 2d array The same goes with the rest of the result arrays

const result = [
 {
  2019: 100,
  2020: 400,
  2021: 700
 },
 {
  2019: 200,
  2020: 500,
  2021: 800
 },
 {
  2019: 300,
  2020: 600,
  2021: 900
 },
 {
  2019: 20,
  2020: 30,
  2021: 40
 }
]

I would recommend you first transpose your data rows then you can write table using Array.prototype.map and Object.fromEntries -

const transpose = t =>
  t.some(a => Boolean(a.length))
    ? [t.map(a => a[0]), ...transpose(t.map(a => a.slice(1)))]
    : []
    
const table = (columns, rows) =>
  transpose(rows).map(r =>
    Object.fromEntries(columns.map((c,i) =>
      [c, r[i]]
    ))
  )

const dates = ["2019", "2020", "2021"]
const data = [[100, 200, 300, 20], [400, 500, 600, 30], [700, 800, 900, 40]]

console.log(table(dates, data))