Los valores constantes del objeto JSON cambian en el ciclo mientras se crea un nuevo objeto dinámicamente en javascript

Hola, tengo un objeto de plantilla de la siguiente manera:

const baseObj = {
  objKey: '',
  index: 1,
  cells: [
    {
      key: 'id',
      value: ''
    },
    {
      key: 'name',
      value: ''
    }
  ]
};

Quiero crear una matriz dinámica de los objetos de una matriz de la siguiente manera:

const allDetails = [
  {
    objKey: '876',
    name: 'abc',
    id: '123',
    address: '123abc'
  },
  {
    objKey: '098',
    name: 'def',
    id: '456',
    address: '456def'
  },
]

Para esto, estoy escribiendo un ciclo simple de la siguiente manera:

const allData = [];
for(let i = 0; i < allDetails.length; i++)
{
  const detail = allDetails[i];
  const row = Object.assign({}, baseObj);
  row.cells = Object.assign([], baseObj.cells);
  row.key = details.objKey;
  row.index = i+1;
  for(let j = 0; j < row.cells.length; j++)
  {
    const cell = row.cells[j];
    switch(cell.key){
      case 'id': {
        cell.value = detail.id;
        break;
      }
      case 'name': {
        cell.value = detail.name;
        break;
      }
    }
  }
  allData.push(row);
}

Ahora espero que allData sea:

[
  {
    objKey: '876',
    index: 1,
    cells: [
      {
        key: 'id',
        value: '123'
      },
      {
        key: 'name',
        value: 'abc'
      }
    ]
  },
  {
    objKey: '098',
    index: 2,
    cells: [
      {
        key: 'id',
        value: '456'
      },
      {
        key: 'name',
        value: 'def'
      }
    ]
  }
]

pero cuando imprimo me da como:

[
  {
    objKey: '876',
    index: 1,
    cells: [
      {
        key: 'id',
        value: '456'
      },
      {
        key: 'name',
        value: 'def'
      }
    ]
  },
  {
    objKey: '098',
    index: 2,
    cells: [
      {
        key: 'id',
        value: '456'
      },
      {
        key: 'name',
        value: 'def'
      }
    ]
  }
]

Parece que los valores de la matriz se sobrescriben cada vez. Al depurar, puedo ver de alguna manera que al cambiar los valores de las celdas de fila, también está cambiando los valores de las celdas para baseObj. Sin embargo, solo el problema surge para la matriz del objeto. No pude ver dónde me equivoqué, ya que en cada ciclo creo la nueva fila de objetos desde baseObj. ¿Alguien puede detectar el error que estoy cometiendo?

Respuesta

Tienes que tener cuidado con la mutación de tus objetos. Lo mejor es realizar una clonación profunda de sus objetos y matrices.

Aquí hay otra forma de escribir su código:

const allData = [];
for (let i = 0; i < allDetails.length; i++) {
    const detail = allDetails[i];
    const cells = [];
    for (let j = 0; j < baseObj.cells.length; j++) {
        const cell = {...baseObj.cells[j]};
        switch (cell.key) {
            case 'id':
                cell.value = detail.id;
                break;
            case 'name':
                cell.value = detail.name;
                break;
        }
        cells.push(cell)
    }
    const row = {objKey: detail.objKey, index: i + 1, cells};
    allData.push(row);
}