JavaScript数组克隆

我有这个方法来创build一个数组

var playerList = []; exports.player = function(socket, name) { this.id = socket.id; this.name = name; this.x = 20; this.y = 40; return this } exports.addPlayer = function(data) { playerList.push(data) } 

而且我正在像这样向playerList数组添加项目

 var client = new player(socket, data); exports.addPlayer(client); 

但我也有一个function,使下面

 exports.getSafeList = function(id) { var player_array = playerList.slice(); for(var i = 0; i < player_array.length; i++) { if(player_array[i].id != id) { player_array[i].id = 'unknown'; } } return player_array; } 

现在我做了以下

 exports.getPlayerList = function() { return playerList; } console.log(players.getPlayerList()) console.log(players.getSafeList(id)) 

到目前为止代码工作正常,但是当我login2函数似乎getPlayerListvariables合并与player_list之一,这是输出

当只有一名队员在arrays上

 [ { id: 'tjvh8XdMtX-o6QYDAAAB', name: 'Raggaer', x: 20, y: 40 } ] [ { id: 'tjvh8XdMtX-o6QYDAAAB', name: 'Raggaer', x: 20, y: 40 } ] 

但是当有更多的:

 [ { id: 'unknown', name: 'Raggaer', x: 20, y: 40 }, { id: '2-K5At07wLV4BDiAAAAC', name: 'Alvaro', x: 20, y: 40 } ] [ { id: 'unknown', name: 'Alvaro', x: 20, y: 40 }, { id: '2-K5At07wLV4BDiAAAAC', name: 'Alvaro', x: 20, y: 40 } ] 

正如你可以在两个arrays上看到, id不应该显示为“unknown”,因为我不是在执行playerList数组…

问题是虽然Array.prototype.slice()将创build原始数组的单独副本,但其项目仍然是对相同对象实例的引用。 因此,修改一个数组中的项目最终会修改克隆数组中的相应项目。

如果您的项目是简单的数据对象(无function),这种解决方法可能会为您做的伎俩:

 // instead of "var player_array = playerList.slice();" var player_array = JSON.parse(JSON.stringify(playerList));