JavaScript对象w/Async+forEach循环-值分配问题



我的目标是创建一个名为"tallys"的对象,该对象为游戏中的每个用户都有一个键,分配给这些用户键的值是一个数组,表示在游戏中每周赢得的美元值。首先,我给游戏中的每个用户分配一个长度为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);
};

在这一点上,我的状态仍然很好——这让我得到了我想要的,两个不同的"one_answers"数组,到目前为止在游戏中已经发生了两周:

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' },
]

这就是事情变得一团糟的地方。我修改了以前的函数,每周对我的"sums"数组执行forEach,并设计了修改"tallys"对象,以修改分配给每周的数组位置,并为每个用户提供适当的美元值。(此外,为了避免这里的"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在评论中的回答是正确的。当我按照他的建议编辑创建"tallys"的初始代码时,一切都会正常工作@vothanhdat的方法也解决了这个问题,我将其标记为建议的答案,其中我克隆了最初的"周"数组。

let tallys = {};
users.forEach(user => {
let weeks = [];
for (let i=0; i < maxWeek+1; i++) {
weeks.push(0)
};
tallys[user] = weeks;
});

您的问题是每个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
});

相关内容

  • 没有找到相关文章

最新更新