JavaScript数组克隆

JavaScript数组克隆,javascript,arrays,node.js,Javascript,Arrays,Node.js,我用这种方法制作一个数组 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) } 我正在向pl

我用这种方法制作一个数组

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);
但我也得到了一个函数,它可以

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))
到目前为止,代码工作正常,但当我记录这两个函数时,似乎
getPlayerList
变量与
player\u list
one合并,这就是输出

当阵型上只有一个玩家时

[ { 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 } ]
正如您在两个数组上看到的那样,
id
在不应该显示为“未知”时显示为“未知”,因为我没有修改
playerList
数组…

问题是,虽然它将创建原始数组的单独副本,但它的项仍然是对相同对象实例的引用。因此,修改一个数组中的项最终会修改克隆数组中的相应项

如果您的项是简单的数据对象(没有函数),此解决方案可能会为您带来以下好处:

// instead of "var player_array = playerList.slice();"
var player_array = JSON.parse(JSON.stringify(playerList));
playerList.slice()。两个数组将引用相同的对象。