3

I have a for loop, that adds data into an array. but when I console.log the array, it is full of the last item of the for loop!

Here is my code :

var materialsData = results[1].data, // results[1].data is a http.get return
ln = Object.size(materialsData),
materials = [],
material = {};
material['Product'] = {};
for (var i = 0; i < ln; i++) {
 material.Product['Name'] = materialsData[i].Product.Name;
 material.Product['Id'] = materialsData[i].Product.Id;
 material.StartingDate = materialsData[i].StartingDate.replace("T00:00:00", "").split('-').reverse().join('-');
 material.Device = materialsData[i].Device;
 materials.push(material);
}
Satpal
134k13 gold badges168 silver badges171 bronze badges
asked Jan 16, 2017 at 11:39
2
  • 2
    Where and how have you defined variable material? Commented Jan 16, 2017 at 11:40
  • Objects are passed by reference. So every iteration, you are overriding same variable Commented Jan 16, 2017 at 11:40

3 Answers 3

5

Define material in the for block. As Objects are passed by reference same object is updated and pushed to the array.

for (var i = 0; i < ln; i++) {
 var material = {
 Product : {
 Name : materialsData[i].Product.Name,
 Id : materialsData[i].Product.Id,
 },
 StartingDate : materialsData[i].StartingDate.replace("T00:00:00", "").split('-').reverse().join('-'),
 Device : materialsData[i].Device
 };
 materials.push(material);
}

Additionally, You can use Array.map()

var materials = materialsData.map(function(m){
 return {
 Product : {
 Name : m.Product.Name,
 Id : m.Product.Id,
 },
 StartingDate : m.StartingDate.replace("T00:00:00", "").split('-').reverse().join('-'),
 Device : m.Device
 };
})
answered Jan 16, 2017 at 11:42
Sign up to request clarification or add additional context in comments.

Comments

4

You are updating and pushing the same object reference again and again so the object holds the last element values. Instead, initialize the object holding variable inside the for loop beginning.

for(var i=0; i<ln; i++){
 // initialize the object
 var material = { Product : {}, Id : {}};
 material.Product['Name'] = materialsData[i].Product.Name;
 material.Product['Id'] = materialsData[i].Product.Id;
 material.StartingDate = materialsData[i].StartingDate.replace("T00:00:00", "").split('-').reverse().join('-');
 material.Device = materialsData[i].Device;
 materials.push(material);
}

Or directly define the object as the argument of push method without holding it to any variable.

for (var i = 0; i < ln; i++) {
 materials.push({
 Product: {
 Name: materialsData[i].Product.Name,
 Id: materialsData[i].Product.Id,
 },
 StartingDate: materialsData[i].StartingDate.replace("T00:00:00", "").split('-').reverse().join('-'),
 Device: materialsData[i].Device
 })
}
answered Jan 16, 2017 at 11:40

Comments

0

You are indeed referencing the same object. For me the trick was to wrap the object in question around JSON.stringify() and then within the loop I call JSON.parse() on the resulting string to turn it back

var materialsDataString = JSON.stringify(results[1].data), // results[1].data is a http.get return
ln = Object.size(materialsData),
materials = [],
material = {};
material['Product'] = {};
for (var i = 0; i < ln; i++) {
 var materialsData = JSON.parse(materialsDataString)
 material.Product['Name'] = materialsData[i].Product.Name;
 material.Product['Id'] = materialsData[i].Product.Id;
 material.StartingDate = materialsData[i].StartingDate.replace("T00:00:00", "").split('-').reverse().join('-');
 material.Device = materialsData[i].Device;
 materials.push(material);
}

.

answered May 5, 2021 at 9:40

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.