【问题标题】:Copying a javascript array inside a class protoype function [duplicate]在类原型函数中复制javascript数组[重复]
【发布时间】:2016-09-23 19:39:26
【问题描述】:

我在 javascript 上有这个课程:

function Node(board,x,y,t){
    this.board = board;
    this.x = x;
    this.y = y;
    this.playerTile = t;
    this.oponentTile = getOponentTile(this.playerTile);
    this.parent = null;
    this.getChildren = getChildren;

};

我正在使用这个函数,它使用slice()this.board 变量(它是一个数组)复制到tempBoard 变量

var getChildren = function() {
        if(this.x==-1 && this.y ==-1){
            var moves = getAllValidMoves(this.board,this.playerTile);
        }
        else{
            var tempBoard = this.board.slice();
            makeMove(tempBoard,this.playerTile,this.x,this.y);
            var moves = getAllValidMoves(tempBoard,this.playerTile);
        }

        var children = [];
        for(var i = 0;i<moves.length;i++){
            var currentMove = moves[i];
            var currentBoard = this.board.slice();
            if(this.x==-1 && this.y ==-1){
                children.push(new Node(currentBoard,currentMove[0],currentMove[1],this.playerTile));
            }
            else{
                makeMove(currentBoard,this.playerTile,this.x,this.y)
                children.push(new Node(currentBoard,currentMove[0],currentMove[1],this.oponentTile));
            }

        }
        return children;
    };

问题是在调用makemove() 之后tempBoardthis.board 变量都被修改了。

有没有什么方法可以在没有引用的情况下复制数组?

【问题讨论】:

  • 所以你想要一个深拷贝? .slice() 只做浅拷贝。
  • var tempBoard = []; this.board.slice().forEach(function(b){tempBoard.push(b)});
  • @JoseHermosillaRodrigo:也不例外。
  • 数组this.board是什么类型的数据?

标签: javascript arrays


【解决方案1】:

.slice() 对数组进行浅拷贝,而不是深拷贝。

这意味着如果你有一个对象数组并且你使用.slice() 来制作数组的副本,它会为你提供一个新数组,它是第一级副本。但是新数组指向所有与第一个数组相同的对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组。

但是,如果您修改数组中的对象,则两个数组中的对象都是相同的,因此对数组中的任何对象进行修改(例如更改对象的属性)都会在两个数组中看到。

如果您想要数组及其内容的完整副本,那么您必须制作一个更复杂的深层副本,并且可能稍微取决于您在数组中的确切内容。

制作深拷贝的方法有很多种。您可以在以下参考资料中了解其中的许多内容:

How do I correctly clone a JavaScript object?

Copying an array of objects into another array in javascript (Deep Copy)

Copying array by value in JavaScript

如果你保证你的数组中没有任何循环引用(一个对象指向另一个指向它的对象),那么制作副本的最简单方法是:

var tempBoard = JSON.parse(JSON.stringify(this.board));

【讨论】:

  • 哦,这很有趣。那么是的,我需要一个深拷贝。我的数组只包含字符串。
  • @PabloEstrada - 你确定数组只包含字符串吗?因为字符串在 Javascript 中是不可变的,所以 .slice() 可以很好地复制。你能告诉我们数组中的实际内容以及你认为两者都发生变化的原因吗?
  • 对不起,我的错。我有一个字符串数组。像这样[[' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ']]
  • @PabloEstrada - 那么你确实需要一个深拷贝。我添加了几处关于制作深拷贝的方法的参考资料和一个示例。
  • 感谢您的完整回答 :) stringify 对我有用。
【解决方案2】:

也许有帮助

function copy(data){
    var result = JSON.stringify(data);
    return JSON.parse(result);
}

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多