Hello I have a template object as follows:
const baseObj = {
objKey: '',
index: 1,
cells: [
{
key: 'id',
value: ''
},
{
key: 'name',
value: ''
}
]
};
I want to create a dynamic array of the objects from an array as follows:
const allDetails = [
{
objKey: '876',
name: 'abc',
id: '123',
address: '123abc'
},
{
objKey: '098',
name: 'def',
id: '456',
address: '456def'
},
]
For this I am writing a simple loop as follows:
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);
}
Now I am expecting allData to be:
[
{
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'
}
]
}
]
but when I print it is giving me as:
[
{
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'
}
]
}
]
Looks like the array values are being overwritten every time. On debugging I can see somehow while changing the values of row cells it is also changing values for cells for baseObj. However only the issue is coming for array of the object. I could not see where I am going wrong as in every loop I create the new object row from the baseObj. Can anyone spot the mistake I am making.
Advertisement
Answer
You have to be careful about mutating your objects. It is best to deep clone your objects and arrays.
Here is another way to write your code:
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);
}