[英]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 循環,它更快但更難閱讀並且更容易出錯(例如,差一錯誤)。 我會堅持使用這個版本,直到/除非你的分析器告訴你它太慢了。
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.