在jquery中将值推送到数组

时间:2016-03-20 20:31:55

标签: javascript jquery arrays asp.net-mvc list

我有项目列表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”

它似乎将最后一个版本附加到所有数据

请咨询。感谢

3 个答案:

答案 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时,dataquotations[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
});