微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复制2D阵列时出现问题

如何解决复制2D阵列时出现问题

在这里的目标是为2D阵列找到'N'。 'N'=拐角元素之和*非拐角元素之和。 对于“ N”计算,我将String和Boolean元素分别更改为其ASCII,1或0。但是我的原始数组在此过程中发生了变化。 不明白为什么?

 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()到此结束。它应返回“ N”,而不更改原始数组。由于所有计算都是在临时数组上完成的。但是事实并非如此。

解决方法

您的问题是因为arr是一个数组数组;当您使用

复制它时
temp = [...arr]

temp成为对arr中相同子数组的引用的数组。因此,当您更改temp中的值时,它也会更改arr中的相应值。您可以在一个简单的示例中看到它:

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

要解决此问题,请使用诸如herehere中所述的深层副本。例如,如果arr最多为二维,则可以嵌套扩展运算符:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。