簡體   English   中英

Object.values() 不更新變量

[英]Object.values() not updating variable

我將變量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之間的差異。

我的function計算出來的差值是:

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];
    }    
}

預期的 output 將具有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];

所以我似乎對Object.values上的G.playerStatsDifference有一些疑問。 關於為什么會這樣以及我如何通過循環運行它的任何想法?

=====

編輯:正如評論中的那些人所指出的,我的問題有點令人困惑,所以我會嘗試在這里澄清它。

G.playerStatsDifference值應該跟蹤 G.playerStats 的先前值與G.playerStats的當前值之間的G.playerStats

為此,我將oldPlayerStats的值設置為等於G.playerStats ,然后將G.playerStats更新為其新值。

然后我需要遍歷對象數組並從oldPlayerStats中減去G.playerStats的值。 這將產生G.playerStatsDifference的值

這就是循環的目的,通過每個 object 鍵到 go 並進行計算。

希望這提供了一些清晰度。 對不起,問題措辭不佳。

 // for testing purposes, create an object with some random stats const randomPlayerStats = () => Object.fromEntries( ['carpenter','wood','gunman','gunpowder','merchant','gold','fleet','flagship'].map(k=>[k,Math.random()*10|0])); // array of the last player stats recorded for each player let lastPlayerStats = []; // create a new object from the existing object, subtracting each entry // from the old object from the entry from the new object // note: uses the?? operator so that if there is no last object yet, // the last object value will be treated as being zero const difference = (playerStats, lastPlayerStats) => { let r = Object.fromEntries(Object.entries(playerStats).map(([k,v])=> [k, v-(lastPlayerStats?.[k]??0)])); lastPlayerStats = playerStats; return r; }; // simulate 5 rounds of the game, with 2 players in the game const playerCount = 2; const simulatedRounds = 5; for(let c=0;c<simulatedRounds;c++) { let playerStats = [...Array(playerCount).keys()].map(i=>randomPlayerStats()); let playerStatsDifference = playerStats.map((s,i)=> difference(s, lastPlayerStats[i]??{})); console.log('playerStats:'); console.log(playerStats); console.log('playerStatsDifference:'); console.log(playerStatsDifference); }

const diffBetweenObjectValues = (a, b) => {
  return Object.entries(a).reduce((result, [aKey, aVal]) => {
    result[aKey] = aVal - (b[aKey] ?? 0);
    return result;
  }, {});
}

const stats = { a: 1, b: 2 };
const updatedStats = { a: 1, b: 1 };

// Initial player stats are { a: 1, b: 2 }
const player = { stats: stats, diff: {} };

// Set the diff, value is { a: 0, b: 1 }
player.diff = diffBetweenObjectValues(player.stats, updatedStats);

// Actually update the stats, value is { a: 1, b: 1 }
player.stats = updatedStats;

請注意,如果b中存在鍵但 a 中不a ,則它會被忽略。 另請注意,這在所有屬性值都是數字時才能正常工作。

您可以將 state 轉換放在 function 中,並在需要更新統計數據時運行它(例如游戲循環的每個滴答聲)。

回應評論

好的,讓我們添加另一個助手 function

const zip = (a, b) => a.map((x, i) => [x, b[i]]);

const players = [...]; // array of players
const statUpdates = [...];   // array of stat updates
zip(players, statUpdates).forEach(([player, stats]) => {
  player.diff = diffBetweenObjectValues(player.stats, stats);
  player.stats = stats;
});

Zip 將玩家數組和統計更新數組組合成對,然后使用forEach迭代它們,解構這些位,然后運行更新。 您也可以只使用 for 循環,它更快但更難閱讀並且更容易出錯(例如,差一錯誤)。 我會堅持使用這個版本,直到/除非你的分析器告訴你它太慢了。

更新 2

const currentStats = [{ a: 1, b: 2 }, {a: 3, b: 2 }];
const updatedStats = [{ a: 0, b: 1 }, {a: 4, b: 1 }];
const diffedStats = zip(currentStats, updatedStats).map(([current, updated]) => {
  return diffBetweenObjectValues(current, updated);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM