Tujuan saya di sini adalah membuat objek, 'penghitungan', yang memiliki kunci untuk setiap pengguna dalam game, dan nilai yang ditetapkan untuk kunci pengguna tersebut adalah larik yang mewakili nilai dolar mingguan yang dimenangkan dalam game. Untuk memulai, saya menetapkan setiap pengguna dalam game sebuah array dengan panjang 26 (mewakili 26 minggu dalam game) dengan 26 nilai '0' untuk mewakili nilai $0 untuk setiap minggu untuk memulai melalui kode ini:

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

... yang menghasilkan objek seperti ini:

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
}

Kemudian, saya menjalankan sedikit for loop untuk menghitung total untuk setiap pengguna berdasarkan minggu ... dengan variabel 'j' di sini mulai dari minggu 1, dan loop berjalan selama beberapa minggu saat game telah berjalan, seperti ini:

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);
 };

Saya masih dalam kondisi yang baik pada saat ini -- ini membuat saya mendapatkan apa yang saya inginkan, dua susunan 'jumlah' yang berbeda selama dua minggu yang telah terjadi dalam permainan sejauh ini:

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

Jadi di sinilah hal-hal menjadi berantakan. Saya memodifikasi fungsi sebelumnya untuk melakukan forEach pada array 'jumlah' saya untuk setiap minggu, dengan desain untuk memodifikasi objek 'penghitungan' untuk mengubah posisi array yang ditetapkan untuk setiap minggu dengan nilai dolar yang sesuai untuk setiap pengguna. (Juga, jangan sampai 'j-1' di sini terlihat membingungkan -- itu karena saya ingin minggu permainan 1 ditetapkan ke posisi 0 dalam larik daripada posisi pertama):

  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);
      })
    };

Jadi apa yang saya harapkan di sini adalah berakhir dengan sesuatu seperti ini:

tallys = {
mikeduin: [-4.27, -1.41, 0, 0, 0 ... etc],
superbkn: [47.58, 14.06, 0, 0, 0 ... etc],
... etc
}

... dengan nilai yang sesuai untuk setiap pengguna. NAMUN! Inilah yang saya dapatkan sebagai objek penghitungan saya setelah semua loop dll selesai:

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
}

.... dll, tetapi untuk setiap pengguna. Ini memberi SETIAP pengguna nilai yang sama persis berulang kali -- semuanya berakhir dengan -4,27 dan -1,41 hanya karena itu adalah nilai 'd' terakhir yang diulang.

Mengapa memperbarui setiap nama pengguna dengan nilai relevan terakhir ketika saya memiliki tallys[weekSum.username] dalam kode saya, sehingga seharusnya hanya memperbarui satu nama pengguna setiap kali di objek tallys??

Terima kasih sebelumnya atas bantuan apa pun!


EDIT: Sekali lagi terima kasih atas bantuan semua orang. Jawaban @Bergi di komentar benar. Ketika saya mengedit kode awal saya yang membuat 'penghitungan' seperti yang dia sarankan - semuanya berfungsi sebagaimana mestinya. Pendekatan @ vothanhdat yang saya tandai sebagai jawaban yang disarankan di mana saya mengkloning array 'minggu' awal juga memecahkan masalah.

let tallys = {};
users.forEach(user => {
  let weeks = [];
  for (let i=0; i < maxWeek+1; i++) {
     weeks.push(0)
  };
  tallys[user] = weeks;
});
0
unvrsltravlr 29 Oktober 2019, 12:46

1 menjawab

Jawaban Terbaik

Masalah Anda adalah setiap tallys[user] referensi ke array weeks yang sama.

Contoh:

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]

Jadi solusinya adalah clone array week untuk setiap pengguna

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
});
-1
vothanhdat 29 Oktober 2019, 11:08