在类原型函数中复制javascript数组[重复]

Posted

技术标签:

【中文标题】在类原型函数中复制javascript数组[重复]【英文标题】:Copying a javascript array inside a class protoype function [duplicate] 【发布时间】: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是什么类型的数据? 【参考方案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);

【讨论】:

以上是关于在类原型函数中复制javascript数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

javascript中原型属性的用途是啥? [复制]

在构造函数与原型中声明javascript对象方法[重复]

在 JavaScript 原型函数中保留对“this”的引用 [重复]

javascript原型和内存[重复]

在 javascript 中,当你 new() 一个函数时会发生啥? [复制]

javascript原型,原型链 有啥特点