我在这里的目标是创建一个“理货”对象,该对象具有游戏中每个用户的键,并且分配给这些用户键的值是一个数组,表示每周在游戏中赢得的美元价值。首先,我为游戏中的每个用户分配一个长度为26的数组(代表游戏中的26周),并用26个值“ 0”表示每周通过此代码开始的$ 0值:
const maxWeek = 25;
let weeks = [];
for (let i=0; i < maxWeek+1; i++) {
weeks.push(0)
};
let tallys = {};
users.forEach(user => {
tallys[user] = weeks;
});
...这将导致如下对象:
tallys is {
michaeljpow: [
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0
],
'Mr. Cheeseburger': [
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0
],
'brewster.stanislaw': [
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0
],
... etc
}
然后,我运行一点for循环,以按周计算每个用户的总数……这里的'j'变量从第1周开始,循环运行了与游戏运行时间相同的周数,像这样:
for (let j=1; j<wk+1; j++) {
let sums = await BonusEvents().where({week: j}).sum('dollars_total as d').groupBy('username').select('username');
console.log('sums for week ', j, ' are ', sums);
};
目前我的状态还不错-到目前为止,这已经满足了我的需求,这是到目前为止游戏中两周两个不同的“求和”数组:
sums for week 1 are [
{ d: -4.27, username: 'Mr. Cheeseburger' },
{ d: -4.27, username: 'dannuzio' },
{ d: 11.29, username: 'james.johnsonf' },
{ d: -4.27, username: 'brewster.stanislaw' },
{ d: 16.47, username: 'eric.wj.clarke' },
{ d: -4.27, username: 'mikeduin' },
{ d: 11.29, username: 'BH84' },
{ d: -4.27, username: 'kevsims' },
{ d: 11.29, username: 'michaeljpow' },
{ d: 47.58, username: 'superbkn' },
{ d: -4.27, username: 'whpfwashington' },
{ d: -4.27, username: 'benjamininghram' }
]
sums for week 2 are [
{ d: -1.41, username: 'benjamininghram' },
{ d: -1.41, username: 'BH84' },
{ d: -1.41, username: 'brewster.stanislaw' },
{ d: -1.41, username: 'dannuzio' },
{ d: -1.41, username: 'eric.wj.clarke' },
{ d: -1.41, username: 'james.johnsonf' },
{ d: -1.41, username: 'kevsims' },
{ d: -1.41, username: 'michaeljpow' },
{ d: -1.41, username: 'mikeduin' },
{ d: -1.41, username: 'Mr. Cheeseburger' },
{ d: 14.06, username: 'superbkn' },
{ d: -1.41, username: 'whpfwashington' },
]
所以这是一团糟的地方。我修改了先前的功能,以便每周对我的“汇总”数组进行一次forEach,并设计了修改“ tally”对象的方法,以使用每个用户合适的美元值来修改分配给每周的数组位置。 (另外,以免这里的“ j-1”看起来令人困惑-这是因为我希望将游戏周1分配给数组中的0位置而不是第一个位置):
for (let j=1; j<wk+1; j++) {
let sums = await BonusEvents().where({week: j}).sum('dollars_total as d').groupBy('username').select('username');
sums.forEach(weekSum => {
tallys[weekSum.username][j-1] = weekSum.d;
console.log('tallys are ', tallys);
})
};
所以我在这里期望得到的结果是这样的:
tallys = {
mikeduin: [-4.27, -1.41, 0, 0, 0 ... etc],
superbkn: [47.58, 14.06, 0, 0, 0 ... etc],
... etc
}
...,为每个用户提供适当的值。然而!一旦所有循环等完成,这就是我最终得到的提示对象:
tallys are {
michaeljpow: [
-4.27, -1.41, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0
],
'Mr. Cheeseburger': [
-4.27, -1.41, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0
],
superbkn: [
-4.27, -1.41, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0
],
...etc
}
....等,但对于每个用户。一次又一次地为每个用户分配完全相同的值-他们最终都得到-4.27和-1.41,这是因为这是最后一个循环通过的“ d”值。
为什么在我的代码中有 tallys [weekSum.username] 时,它会使用最后一个相关的值更新每个用户名,因此每次在tallys对象中仅应更新一个用户名??
在此先感谢您的帮助!
编辑:再次感谢大家的帮助。 @Bergi在评论中的答案是正确的。当我编辑我的初始代码时(如他建议的那样),它会创建“ tally”-一切都会正常进行。我将@vothanhdat的方法标记为建议的答案,在该方法中克隆了初始的“ weeks”数组也解决了该问题。
let tallys = {};
users.forEach(user => {
let weeks = [];
for (let i=0; i < maxWeek+1; i++) {
weeks.push(0)
};
tallys[user] = weeks;
});
答案 0 :(得分:-1)
您的问题是每个tallys[user]
引用相同的weeks
数组。
示例:
let a = [1,2,3]
console.log(a) // [1,2,3]
let b = a // now a & b is reference to the same array
b[0] = 100
console.log(a) // [100,2,3]
因此解决方案是为每个用户提供每周一次的克隆阵列
const maxWeek = 25;
let weeks = [];
for (let i = 0; i < maxWeek + 1; i++) {
weeks.push(0)
};
let tallys = {};
users.forEach(user => {
tallys[user] = [...weeks] //Clone week array
});