2017-01-16 3 views
1

У меня есть цикл for, который добавляет данные в array. , но когда я console.log массив, он заполнен последним элементом цикла for!Javascript массив с циклом for, возвращает только последний элемент

Вот мой код:

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

Где и как у вас определена переменная 'material'? – Satpal

+0

Объекты передаются по ссылке. Итак, каждая итерация, вы переопределяете одну и ту же переменную – Rajesh

ответ

1

Определить material в for блоке. Поскольку объекты передаются по ссылке, то object обновляется и помещается в массив.

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

Кроме того, Вы можете использовать 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 
    }; 
}) 
2

Вы обновляете и нажав ту же ссылку на объект снова и снова, так что объект содержит последние значения элементов. Вместо этого инициализируйте переменную хранения объекта внутри цикла for.

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

Или непосредственно определяет объект в качестве аргумента нажимной методы без удержания его в любом переменном.

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 
    }) 
} 
Смежные вопросы