0

Why the first example does not give me the expected result, but the second. They are basically the same. My expected console output of processedData2 should be

[
  {
    "id": "someid",
    "parts": [
      {
        "part_id": "1"
      }
    ]
  },
  {
    "id": "someid",
    "parts": [
      {
        "part_id": "2"
      }
    ]
  },
  {
    "id": "someid",
    "parts": [
      {
        "part_id": "3"
      }
    ]
  }
]

like in the second example.

Example 1 (should work since "processedData" is the same as in the second example, but doesn't)

let putData = [
  {
    id: 'someid',
    parts: [
      {
        part_id: '1',
      },
      {
        part_id: '2',
      },
      {
        part_id: '3',
      },
    ],
  },
];
let processedData = [];
for (let i of putData) {
  for (let o in i.parts) {
    processedData.push(i);
  }
}
console.log('processed Data ', processedData);
let processedData2 = processedData;
console.log('processedData 2 before ', processedData2);
for (let i = 0; i < processedData.length; i++) {
  console.log(processedData[i].parts[i]);
  processedData2[i].parts = [processedData[i].parts[i]];
  console.log(processedData2[i].parts[i]);
}
console.log('processedData 2 after', processedData2);

Second Example (works correct)

let processedData = [
  {
    id: 'someid',
    parts: [
      {
        part_id: '1',
      },
      {
        part_id: '2',
      },
      {
        part_id: '3',
      },
    ],
  },
  {
    id: 'someid',

    parts: [
      {
        part_id: '1',
      },
      {
        part_id: '2',
      },
      {
        part_id: '3',
      },
    ],
  },
  {
    id: 'someid',
    parts: [
      {
        part_id: '1',
      },
      {
        part_id: '2',
      },
      {
        part_id: '3',
      },
    ],
  },
];
console.log('processed Data ', processedData);
let processedData2 = processedData;
console.log('processedData 2 before ', processedData2);
for (let i = 0; i < processedData.length; i++) {
  console.log(processedData[i].parts[i]);
  processedData2[i].parts = [processedData[i].parts[i]];
  console.log(processedData2[i].parts[i]);
}
console.log('processedData 2 after', processedData2);

heres a link to a demo in Stackblitz: https://stackblitz.com/edit/js-8iqqp7?file=index.js

Tobi
  • 73
  • 8
  • 1
    `let processedData2 = processedData;` just makes `processedData2` and `processedData` both point to the **same** array, it doesn't *copy* the array. To make a shallow copy of the array, you have to do that on purpose, for instance `let processedData2 = [...processedData];` or `let processedData2 = processedData.slice();` – T.J. Crowder Feb 08 '23 at 12:23
  • 1
    @T.J.Crowder It's probably helpful to use the term shallow copy for `let processedData2 = [...processedData];` and `let processedData2 = processedData.slice();` in the context of this question. – jabaa Feb 08 '23 at 12:26

0 Answers0