JavaScript объект с Async + forEach Loop - проблемы с присвоением значения - PullRequest
0 голосов
/ 29 октября 2019

Моя цель здесь - создать объект '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;
});
...