我有这种方法来制作数组
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_list
变量合并,这就是输出
当阵列上只有一个玩家时
[ { 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
数组...
最佳答案
问题是虽然 Array.prototype.slice()将创建原始数组的单独副本,其项目仍将是对相同对象实例的引用。因此,修改一个数组中的一项最终会修改克隆数组中的相应项。
如果您的项目是简单的数据对象(无函数),此变通方法可能对您有用:
// instead of "var player_array = playerList.slice();"
var player_array = JSON.parse(JSON.stringify(playerList));
关于JavaScript 数组克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464864/