1

So since JavaScript doesn't let you copy array using "=" I have to write this code. But it doesn't work

let arr = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];
var arrclone = [];

for (let x = 0; x < arr.length; x++) {
  for (let y = 0; y < arr[x].length; y++) {
    arrclone[x][y] = arr[x][y];
  }
}
console.log(arrclone);

It said

arrclone[x][y] = arr[x][y];
                    ^
TypeError: Cannot set property '0' of undefined. 

How is it undefined both of them are already been declared. Sorry, I am a beginner sorry if my question seems stupid.

pilchard
  • 12,414
  • 5
  • 11
  • 23
Khang
  • 33
  • 3

3 Answers3

2

When you start, each row of the array is empty. So initialise it to an empty row of array:

for (let x = 0; x < arr.length; x++) {
  // Use this...
  arrclone[x] = [];     // ========================> You missed this line.
  for (let y = 0; y < arr[x].length; y++) {
    arrclone[x][y] = arr[x][y];
  }
}

FYI, for the right approach, please use Array.slice() (but only for primitive values, see the problem here).

Praveen Kumar Purushothaman
  • 164,888
  • 24
  • 203
  • 252
  • So small elements in a mother array have to be declared as array type too before you can add stuff into them ? I didnt know that, I thought when I use arrclone[x][y] = ... then JavaScript would automatic understand arrclone[x] is also an array too. Thanks sir – Khang Aug 12 '21 at 22:07
2

You should ideally be using Array.slice() for copying arrays:

let arr = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];
var arrclone = arr.map(e => e.slice());
console.log(arrclone);
Spectric
  • 30,714
  • 6
  • 20
  • 43
1

Javascript is not a language that makes copies on assignment. It uses references and stores them instead. Here you are literally just copying reference to the data instead of actual data. There are multiple ways to help you with this.

  1. The most simple way is to use var arrclone = JSON.parse(JSON.stringify(arr))

  2. We can also use array destructuring and it will look something like this: var arrclone = [...arr]