【问题标题】:Object.values() not updating variableObject.values() 不更新变量
【发布时间】:2022-11-20 23:32:23
【问题描述】:

我将变量 G.playerStatsDifference 定义为一个对象数组:

playerStatsDifference: [{
        carpenter: 0,
        wood: 0,
        gunman: 0,
        gunpowder: 0,
        merchant: 0,
        gold: 0,
        fleet: 0,
        flagship: 0,
    }, {
        carpenter: 0,
        wood: 0,
        gunman: 0,
        gunpowder: 0,
        merchant: 0,
        gold: 0,
        fleet: 0,
        flagship: 0,
    }]

这个变量的要点是计算经常变化的G.playerStats之间的差异。

我计算差异的函数是:

const oldPlayerStats = JSON.parse(JSON.stringify(G.playerStats));
statsDifference(G, oldPlayerStats);  

for (let p = 0; p < 2; p++) { 
    for (let s = 0; s < 8; s++) { 
        Object.values(G.playerStatsDifference[p])[s] = Object.values(G.playerStats[p])[s] - Object.values(oldPlayerStats[p])[s];
    }    
}

预期的输出将是 playerStatsDifference

在运行一些测试时,我做了一些控制台日志记录,它给了我正确的计算,但 G.playerStatsDiffence 不会更新。

这是一些测试,计算是正确的:

console.log("Current wood is " + Object.values(G.playerStats[0])[1]); //Current wood is 5
console.log("Old wood is " + Object.values(oldPlayerStats[0])[1]); //Old wood is 10
console.log(Object.values(G.playerStats[0])[1] - Object.values(oldPlayerStats[0])[1]); //-5

我想也许我在循环中做错了什么所以我之后尝试了以下操作:

Object.values(G.playerStatsDifference[0])[1] = Object.values(G.playerStats[0])[1] - Object.values(oldPlayerStats[0])[1];

但是,这也不起作用。话虽如此,以下确实有效:

G.playerStatsDifference[0].wood = Object.values(G.playerStats[0])[1] - Object.values(oldPlayerStats[0])[1];

所以看起来我对 G.playerStatsDifference 上的 Object.values 有一些疑问。关于为什么会这样以及我如何通过循环运行它的任何想法?

=====

编辑:正如 cmets 中的那些人所指出的,我的问题有点令人困惑,所以我会尝试在这里将其清除。

G.playerStatsDifference 值应该跟踪 G.playerStats 的先前值与 G.playerStats 的当前值之间的差异。

为此,我将 oldPlayerStats 的值设置为等于 G.playerStats,然后将 G.playerStats 更新为其新值。

然后我需要遍历对象数组并从 oldPlayerStats 中减去 G.playerStats 的值。这将产生 G.playerStatsDifference 的值

这就是循环的目的,遍历每个对象键并进行计算。

希望这提供了一些清晰度。对不起,问题措辞不佳。

【问题讨论】:

  • Object.values 是根 Object 类的静态方法。你不能分配给它。用像减法这样的数学运算的结果来调用它也是没有意义的。
  • 那么playerStatsDifference 的规模会随着每个新 playerStats 的公布而增长吗?
  • @AndrewParks 不,值被替换/更新。
  • @evilgenious448 我这么说并没有冒犯的意思(我们都是从某个地方开始的,不尝试是不会变得更好的)但是你的方法太糟糕了我真的不明白你想要完成什么。也许编辑问题以包含更多背景?
  • @JaredSmith 很好,我将编辑问题以使其更清楚。没有冒犯,感谢您的礼貌回应:)

标签: javascript variables


【解决方案1】:

const randomPlayerStats = () => Object.fromEntries(
  ['carpenter','wood','gunman','gunpowder','merchant','gold','fleet','flagship']
    .map(k=>[k,Math.random()*10|0]));

let lastPlayerStats; // start with no last item

const difference = playerStats => {
  let r = Object.entries(playerStats).map(([k,v])=>
    [k, v-(lastPlayerStats?.[k]??0)]);
  lastPlayerStats = playerStats;
  return r;
};

let stats = [randomPlayerStats(), randomPlayerStats(), randomPlayerStats()];

stats.forEach(s=>{
  console.log('stats:');
  console.log(s);
  console.log('difference:');
  console.log(difference(s));
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2021-10-06
    • 2020-12-14
    相关资源
    最近更新 更多