首页 > 解决方案 > 您如何正确更新 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)
        }
      })
    })
  }
})

标签: javascript

解决方案


您的代码看起来大多是合理的,但值得逐步了解究竟发生了什么:

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语句,它应该和以前一样工作。它将遍历单个辅助器,递增四个相关统计信息,然后再次遍历单个辅助器。由于唯一的助手等于自己,因此不会修改其他统计信息。


推荐阅读