我有项目列表data and empty array quotations
:
var data = {};
var quotations = [];
我想用quotations
填充数据值,每次添加新数据时,它都会成功添加,但所有数据值都会获得最后一个值。
例如:
$("#addquotation").click(function () {
debugger;
var itemname = $("#itemname").val();
var cost =parseFloat( $("#cost").val());
var notes = $("#notes").val();
var date = $("#date").val();
data.Item = itemname;
data.Cost = cost;
data.Notes = notes;
data.Date = date;
quotations.push(data);
)};
我第一次添加
“test,45,testnotes,2016-02-03”我第二次加入 “test2,45.2,testnotes2,2016-02-05”
当我调试我获取数据时:
obj(0):“test2,45.2,testnotes2,2016-02-05” OBJ(1): “test2,45.2,testnotes2,2016-02-05”
它似乎将最后一个版本附加到所有数据
请咨询。感谢
答案 0 :(得分:11)
你需要在click处理程序中声明数据,如果它被声明为全局变量,你基本上总是修改并向数组中添加相同的数据对象:
var quotations = [];
$("#addquotation").click(function () {
debugger;
var data = {};
var itemname = $("#itemname").val();
var cost =parseFloat( $("#cost").val());
var notes = $("#notes").val();
var date = $("#date").val();
data.Item = itemname;
data.Cost = cost;
data.Notes = notes;
data.Date = date;
quotations.push(data);
)};
答案 1 :(得分:2)
由于您在点击处理程序之外声明了data
,因此每次都推送相同的对象引用。
更改自:
var data={};
$("#addquotation").click(function () {
要
$("#addquotation").click(function () {
var data={};// declare local variable
答案 2 :(得分:1)
问题在于data
是一个全局变量,您将data
的引用添加到quotations
。
当第一个值被推送到quotations
时,data
和quotations[0]
会引用同一个对象。以下是正在发生的事情的一个例子:
var a = {num: 1};
var b = a;
b.num = 2;
console.log(a.num); // prints 2
将对象推送到数组时会发生同样的事情。 quotations
不包含data
的副本,其中包含对data
的引用,因此修改data
也会修改quotations
。要解决此问题,quotations
的每个元素都必须引用不同的数据对象。这可以通过在函数内部而不是外部定义data
来实现。
替换
var data = {};
$("#addquotation").click(function() {
// populate data, push to quotations
});
与
$("#addquotation").click(function() {
var data = {};
// populate data, push to quotations
});