thycode2020
thycode2020

Reputation: 23

Issue while making a copy of 2D Array

My target here is to find 'N' for a 2D Array. 'N' = sum of corner elements * sum of non corner elements. For 'N' calculation I change String & Boolean elements to their ASCII, 1 or 0 respectively. But my original array gets altered in this process. Can't understand why?

 function findN(arr) {
    var temp = [...arr]
    // first we change all elements to numbers
    for (let i = 0; i < temp.length; i++) {
        for (let j = 0; j < temp.length; j++) {
            if (typeof temp[i][j] == 'string') {
                temp[i][j] = temp[i][j].charCodeAt()
            } else if (temp[i][j] == true) {
                temp[i][j] = 1
            } else if (temp[i][j] == false) {
                temp[i][j] = 0
            }
        }
    }



    // N calculation starts here
    let r = temp.length // rows
    let c = temp[0].length // columns

    var corner_Sum =
        temp[0][0] + temp[0][c - 1] + temp[r - 1][0] + temp[r - 1][c - 1]

    var total_Sum = 0
    for (let i = 0; i < temp.length; i++) {
        for (let j = 0; j < temp.length; j++) {
            total_Sum = total_Sum + arr[i][j]
        }
    }

    var N = corner_Sum * (total_Sum - corner_Sum)

    return N
}

findN() ends here. It should return 'N', without altering the original array. As all calculations were done on temp array. But that's not the case.

Upvotes: 2

Views: 77

Answers (1)

Nick
Nick

Reputation: 147286

Your problem is because arr is an array of arrays; when you copy it using

temp = [...arr]

temp becomes an array of references to the same subarrays in arr. Thus when you change a value in temp it changes the corresponding value in arr. You can see this in a simple example:

let arr = [[1, 2], [3, 4]];
let temp = [...arr];
temp[0][1] = 6;
console.log(arr);
console.log(temp);

To work around this, use a deep copy such as those described here or here. For example, if arr is at most 2-dimensional, you can nest the spread operator:

let arr = [[1, 2], [3, 4]];
let temp = [...arr.map(a => [...a])];
temp[0][1] = 6;
console.log(arr);
console.log(temp);

Upvotes: 3

Related Questions