I am attempting to modify the masterCounter
variable within the timeKeyAdditionCheck
function. Within the timeKeyAdditionCheck
function, I successfully assign a value to masterCounter
, but this change is not reflected within the scope of getEventsWithTime
. When timeKeyAdditionCheck
is complete, the value of masterCounter
returns to null.
What changes do I need to make with timeKeyAdditionCheck
function?
let masterCounter = null; let userTracker = {}; let timeKeyAdditionCheck = ('hour') => { assert((range == 'minute' || range == 'hour'), "In calcArrayof... range value needs to equal 'minute' or 'hours'") if (masterCounter == null) { masterCounter = [{timerange: event.timestamp, totalusercount: 0, totalvalidatorcount: 0, totaletherdeposited: 0}] } if (event.timestamp > (masterCounter[masterCounter.length - 1] + 3599)) { let differenceInTime = event.timestamp - (masterCounter[masterCounter.length - 1] + 3599); let timeKeysNeeded = Math.ceil(differenceInTime / 3600); i = 0; while (i < timeKeysNeeded) { let newEntry = masterCounter[masterCounter.length - 1]; newEntry.timerange = newEntry.timerange + 3600; masterCounter.push(newEntry); i++; } } }
(async () => { let events = await getEventsWithTime(3085928,3089928); for (event of events) { timeKeyAdditionCheck('hour'); checkNewUsers(); addValidatorsAndEth(); } convertToCsv(masterCounter) console.log(masterCounter) })()
Advertisement
Answer
The reason I wasn’t getting the expected output for masterCounter
was because, in the timeKeyAdditionCheck
function, I thought I was making a copy of the object in the masterCounter
array, but I actually created a reference instead. Here is the moment in my code when I unintentionally created a reference instead of a copy:
let newEntry = masterCounter[masterCounter.length - 1];
When I thought I was adding a unique object to the array, I was instead adding the reference to that same object at the end of the array.
I fixed it using the following code:
while (i < timeKeysNeeded) { let lastObjectRef = masterCounter[masterCounter.length - 1]; let newEntry = Object.assign({}, lastObjectRef) newEntry.timerange = newEntry.timerange + 60; masterCounter.push(newEntry); i++; }
I used Object.assign()
to create a copy of the last object in the array instead of creating another reference.