JavaScript 数组克隆

标签 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)
}

我正在像这样将项目添加到 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/

相关文章:

postgresql - 使用 node-postgres 监听查询超时?

javascript - 替换后如何显示原来的元素?

javascript - javascript的椭圆库和golang的ecdsa库的互操作性

java - 将数组传递给方法与将原始数据类型传递给方法不一致

Javascript 将项目添加到当前数组

php - Array_Map 使用多个 native 回调?

node.js - 你如何让亚马逊的 ELB 与 HTTPS/SSL 一起使用 Web 套接字?

javascript - AngularJS:2 路绑定(bind)的奇怪行为(ng-repeat)

javascript - 用于受密码保护的网站的 nodejs 网络抓取工具

html - ionic 标签按钮在选择时不会改变颜色