我有一个for
循环,将数据添加到array
。
但当我console.log
数组时,它充满了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);
}
答案 0 :(得分: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);
}
或直接将对象定义为push方法的参数,而不将其保存到任何变量。
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
})
}
答案 1 :(得分:2)
在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 :(得分:0)
您确实引用了同一个对象。对我来说,诀窍是将有问题的对象包裹在 JSON.stringify()
周围,然后在循环中我对结果字符串调用 JSON.parse()
以将其返回
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);
}
.