我將變數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];
所以看起來我對Object.valueson有一些問題G.playerStatsDifference。關于為什么會這樣以及我如何通過回圈運行它的任何想法?
=====
編輯:正如評論中的那些人所指出的,我的問題有點令人困惑,所以我會嘗試在這里澄清它。
該G.playerStatsDifference值應該跟蹤 的先前值G.playerStats和當前值之間的差異G.playerStats。
為此,我將 的值設定oldPlayerStats為等于G.playerStats,然后更新G.playerStats為新值。
然后我需要遍歷物件陣列并減去G.playerStatsfrom的值oldPlayerStats。這將產生的價值G.playerStatsDifference
這就是回圈的目的,遍歷每個物件鍵并進行計算。
希望這提供了一些清晰度。對不起,問題措辭不佳。
uj5u.com熱心網友回復:
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則會被忽略。另請注意,這僅在所有屬性值都是數字時才能正常作業。
您可以將狀態轉換放在一個函式中,并在需要更新統計資料時運行它(例如游戲回圈的每個滴答聲)。
回應評論
好的,讓我們添加另一個輔助函式
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);
});
uj5u.com熱心網友回復:
// 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536625.html
標籤:javascript变量
上一篇:如何訪問查詢塊之外的變數?
