web-dev-qa-db-ja.com

jqueryの配列に値をプッシュする

アイテムのリストがあります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」2回目に「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"

それはすべてのデータに最後のバージョンを追加するようです

アドバイスを下さい 。ありがとう

5
prime

問題は、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
});
1
afuous