Моя цель здесь - создать объект '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' здесьначиная с первой недели, и цикл продолжается столько же недель, сколько и игра, например:
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 для моего массива 'sums' для каждой недели, с проектами по модификации объекта '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] , так что оно должно обновлять только одно имя пользователя каждый раз вобъект подсчета ??
Заранее благодарим за любую помощь!
РЕДАКТИРОВАТЬ : Еще раз спасибо за помощь всем. Ответ @ Берги в комментариях правильный. Когда я редактирую свой исходный код, который создает «подсчеты», как он предлагает, вот так - все работает как надо. Подход @ vothanhdat, который я обозначил как предлагаемый ответ, в котором я клонирую исходный массив 'недель', также решает проблему.
let tallys = {};
users.forEach(user => {
let weeks = [];
for (let i=0; i < maxWeek+1; i++) {
weeks.push(0)
};
tallys[user] = weeks;
});