【问题标题】:Javascript changes attributes in all items in array of objectsJavascript 更改对象数组中所有项目的属性
【发布时间】:2017-10-13 08:51:46
【问题描述】:

因为这个疯狂的问题,我很沮丧。 我有一个由对象和数组组成的困难数据结构。 它看起来像这样:

Team{
    name: "name_of_team",
    players: [

        // PLAYER 1
        {
            id: 0,
            position: 0,
            track:[

                // POINT 1
                {
                    time: 0,
                    checked: false
                },

                // POINT 2
                {
                    time: 0,
                    checked: false
                },

                // POINT 3
                {
                    time: 0,
                    checked: false
                }
            ]
        },

        // PLAYER 2
        {
            id: 1,
            position: 0,
            track:[

                // POINT 1
                {
                    time: 0,
                    checked: false
                },

                // POINT 2
                {
                    time: 0,
                    checked: false
                },

                // POINT 3
                {
                    time: 0,
                    checked: false
                }
            ]
        }
    ]
}

这样我就可以追踪玩家了。当团队中的一个人到达点时,其参数checked变为true,时间节省了获取该区域的时间。 我的函数如下所示:

var a = Team.players.findIndex(x => x.id === 0);
var position = Team.players[a].position;
Team.players[a].track[position].checked = true;
Team.players[a].track[position].time = new Date();
Team.players[a].position++;

当我检查参数“a”时,它被设置为 0(正确的值),一切看起来都很好。 但是这个数组中的第二个对象(id == 1)中的“checked”和“time”参数也会发生变化。 疯狂的是“位置”参数仅在正确的对象(id == 0)中正确递增。 我试图硬索引数组中的项目,如:

Team.players[0].track...

但它的行为相同。 有没有人经历过这样的事情或任何想法如何避免第二个对象与第一个对象一起被修改。

感谢您的任何建议。

【问题讨论】:

  • position 定义在哪里? js中也没有关联数组,所以如果你提供一个有效的数据示例会有所帮助
  • 嗯,你如何初始化轨道数组中的对象.. 这闻起来很像你有副作用,因为数组中的点对象是同一个对象
  • 对不起。那应该是 position = Team.players[a].position;
  • Player1Player2 应该是数组中的索引。它们是什么?
  • 对象被复制到一个数组中。我在其他地方创建了一个轨道数组,然后将其复制到 player.track。当玩家来自同一个团队时,track 数组将被复制到两个 player.trace 参数中。

标签: javascript arrays object


【解决方案1】:

假设

Team.players[a].position

是位置,那就用它吧。

var a = Team.players.findIndex(x => x.id === 0);
Team.players[a].track[Team.players[a].position].checked = true;
//                    ^^^^^^^^^^^^^^^^^^^^^^^^
Team.players[a].track[Team.players[a].position].time = new Date();
//                    ^^^^^^^^^^^^^^^^^^^^^^^^
Team.players[a].position++;

【讨论】:

  • 我已经修复了代码。我写错了,所以我很抱歉。你现在可以看一下吗?
猜你喜欢
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多