javascript - 您如何正确更新 javascript 中的关系数据?
问题描述
我正在创建一个应用程序,它可以抓取杀戮事件,然后组织在整个游戏中谁互相帮助,以及某人杀了人的次数等。
assistingParticipantIds
可以有 0 到 4 个 id
在团队中,被助攻是球员协助队友的次数。
在敌人中,kills
是该玩家杀死该玩家deaths
的次数,是您对他死亡的次数。assistedKills
是玩家协助击杀该玩家的时间。assistedDeaths
是当玩家对某人死亡并且该玩家协助他的死亡时。
示例条目:
{ killerId: '125379794576736257',
victimId: '167080722970968064',
assistingParticipantIds: [ '276248160546979840', '136144690067013632' ] }
示例播放器:
{ id: '142068805416255490',
team:
[ { id: '167080722970968064', assisted: 1 },
{ id: '255942275442409472', assisted: 1 },
{ id: '108332752302039040', assisted: 0 },
{ id: '290034993458053121', assisted: 3 } ],
enemies:
[ { id: '193758464231735296',
kills: 0,
assistedKills: 1,
deaths: 0,
assistedDeaths: 0 },
{ id: '125379794576736257',
kills: 1,
assistedKills: 0,
deaths: 0,
assistedDeaths: 0 },
{ id: '276248160546979840',
kills: 0,
assistedKills: 0,
deaths: 0,
assistedDeaths: 0 },
{ id: '121061410527641600',
kills: 0,
assistedKills: 0,
deaths: 0,
assistedDeaths: 0 },
{ id: '136144690067013632',
kills: 0,
assistedKills: 1,
deaths: 0,
assistedDeaths: 0 } ] }
我以为我有这方面的工作代码,但出于某种原因,有些球员会得到比他们应该得到的更多的助攻。
events.forEach(event => {
var killer = event.killerId
var victim = event.victimId
var assisted = event.assistingParticipantIds
// p1 = player to update
// p2 = relation to update
// side = which side they are on
// type = value to update
function updatePlayer(p1, p2, side, type, players) {
players.forEach(a => {
if (a.id == p1) {
a[side].forEach(b => {
if (b.id == p2) {
b[type]++
}
})
}
})
}
updatePlayer(killer, victim, "enemies", "kills", players)
updatePlayer(victim, killer, "enemies", "deaths", players)
if (assisted.length == 1) {
updatePlayer(assisted[0], killer, "team", "assisted", players)
updatePlayer(killer, assisted[0], "team", "assisted", players)
updatePlayer(assisted[0], victim, "enemies", "assistedKills", players)
updatePlayer(victim, assisted[0], "enemies", "assistedDeaths", players)
} else if (assisted.length > 1) {
assisted.forEach(assist => {
updatePlayer(assist, killer, "team", "assisted", players)
updatePlayer(killer, assist, "team", "assisted", players)
updatePlayer(assist, victim, "enemies", "assistedKills", players)
updatePlayer(victim, assist, "enemies", "assistedDeaths", players)
assisted.forEach(c => {
if (assist != c) {
updatePlayer(assist, c, "team", "assisted", players)
}
})
})
}
})
解决方案
您的代码看起来大多是合理的,但值得逐步了解究竟发生了什么:
else if (assisted.length > 1) {
assisted.forEach(assist => {
updatePlayer(assist, killer, "team", "assisted", players)
updatePlayer(killer, assist, "team", "assisted", players)
updatePlayer(assist, victim, "enemies", "assistedKills", players)
updatePlayer(victim, assist, "enemies", "assistedDeaths", players)
您遍历协助击杀的玩家列表。对于每个玩家,您:
- 增加助手协助杀手的次数
- 增加杀手协助助手的次数
- 增加助手协助杀死受害者的次数
- 增加受害者被协助者协助杀死的次数
assisted.forEach(c => {
if (assist != c) {
updatePlayer(assist, c, "team", "assisted", players)
}
})
然后,对于每个其他的助手,你增加第一个助手帮助第二个助手的次数(上帝这个词现在看起来很奇怪)。
这意味着,如果 A 在 B、C 和 D 的帮助下杀死 E,最终的统计数据将是:
- 玩家 A 已被协助3 次(B / C / D +1)
- 玩家 B/C/D 被助攻了 3 次(彼此 +2,A 被 +1)并且对 E有1 次助攻
- 玩家 E分别来自 B、C 和 D 的协助死亡
所以,A/B/C/D都有3次助攻。但是,在不确切知道您期望发生什么的情况下,很难评论问题是什么。
如果您希望 B、C 和 D 各获得一次助攻,那么您只需删除上面的第二个代码块。
如果您希望 A没有助攻,那么您应该删除为杀手增加助攻的线。
另外,顺便说一句:您在这里进行了代码重复:
if (assisted.length == 1) {
...
} else if (assisted.length > 1) {
...
})
你可以扔掉第一个if
语句,它应该和以前一样工作。它将遍历单个辅助器,递增四个相关统计信息,然后再次遍历单个辅助器。由于唯一的助手等于自己,因此不会修改其他统计信息。
推荐阅读
- symfony - nginx 从 url 隐藏 symfony 语言环境
- java - XOR - 解释 3 行
- javascript - 如何删除带有条形标签的代码
- c# - 当没有选择“..选择房间...”之类的项目时如何在组合框中显示文本
- python - 多元分布的等高线图
- dart - 如何使用 PaginatedDataTable 在列、字段和行上正确实现点击事件
- javascript - 如何获取变量的值
- mobx - Mobx:观察对象的反应不起作用
- timestamp - 监控时间戳检查:如何在每次检查时运行自定义脚本?
- graphql - 使用 NEXT.js 和 Apollo 客户端 2 配置订阅