2017-01-16 13 views
1

forループを持っています。これはデータをarrayに追加します。 しかし、配列console.logの場合は、forループの最後の項目でいっぱいです!ここでforループを使用したJavascript配列では、最後の要素のみを返します。

は私のコードです:

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

forブロックでmaterialを定義します。参照によってオブジェクトが渡されると、同じ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 
    }) 
} 
関連する問題