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()。两个数组将引用相同的对象。