I’m trying to push different objects at each time, but it changes the front components while looping the for loop. Here is my code.
let responseArray = []; const sendBatchRequest = async function (response) { try { console.log(`response: ${JSON.stringify(response)}`); if (responseArray.length < 9) { responseArray.push(response); // push 9 components console.log(`responseArray at if: ${JSON.stringify(responseArray)}`); } else { responseArray.push(response); // push last 10th component console.log(`responseArray at else: ${JSON.stringify(responseArray)}`); for (let i = 0; i < responseArray.length; i++) { console.log(`responseArray ${i} - ${JSON.stringify(responseArray[i])}`); } // do something... responseArray = []; // reset the array } } catch (err) { console.log(`sendBatchRequest err: ${err}`); } } const main = async function () { try { const result = {}; for (let i = 0; i < 5; i++) { result.data = i; await sendBatchRequest(result); } } catch (err) { console.log(`main err: ${err}`); } } main();
And my result looks like this.
response: {"data":0} responseArray at if: [{"data":0}] response: {"data":1} responseArray at if: [{"data":1},{"data":1}] response: {"data":2} responseArray at if: [{"data":2},{"data":2},{"data":2}] response: {"data":3} responseArray at if: [{"data":3},{"data":3},{"data":3},{"data":3}] response: {"data":4} responseArray at if: [{"data":4},{"data":4},{"data":4},{"data":4},{"data":4}]
I can’t understand why at 2th loop, responseArray[0]
changes {"data":0}
to {"data":1}
. I want my responseArray
looks like [{"data":0},{"data":1"},...]
. What’s happening on Array.push(object)
at javascript? And how could I get the result what I want?
Advertisement
Answer
It’s because you’re passing the result variable as a reference, everytime the result.data changes, so as the pushed items on the responseArray
will be changed also.
So to avoid that. do this instead:
let responseArray = []; const sendBatchRequest = async function (response) { try { console.log(`response: ${JSON.stringify(response)}`); if (responseArray.length < 9) { responseArray.push(response); // push 9 components console.log(`responseArray at if: ${JSON.stringify(responseArray)}`); } else { responseArray.push(response); // push last 10th component console.log(`responseArray at else: ${JSON.stringify(responseArray)}`); for (let i = 0; i < responseArray.length; i++) { console.log(`responseArray ${i} - ${JSON.stringify(responseArray[i])}`); } // do something... responseArray = []; // reset the array } } catch (err) { console.log(`sendBatchRequest err: ${err}`); } } const main = async function () { try { for (let i = 0; i < 5; i++) { const result = {data: i}; // Do this change await sendBatchRequest(result); } } catch (err) { console.log(`main err: ${err}`); } } main();