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函数似乎getPlayerList
variables合并与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));