web-dev-qa-db-fra.com

Pousser les valeurs vers un tableau dans jquery

J'ai une liste d'articles data and empty array quotations:

   var data = {};
   var quotations = [];

Je veux remplir quotations avec des valeurs de données, chaque fois que j'ajoute de nouvelles données, elles sont ajoutées avec succès mais toutes les valeurs de données obtiennent la dernière valeur.

par exemple :

 $("#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);
)};

pour la première fois j'ajoute

"test, 45, testnotes, 2016-02-03" Deuxième fois que j'ai ajouté "test2,45.2, testnotes2,2016-02-05"

quand je débogue j'obtiens des données comme:

obj (0): "test2,45.2, testnotes2,2016-02-05" obj (1): "test2,45.2, testnotes2,2016-02-05"

il semble qu'il ajoute la dernière version à toutes les données

S'il vous plaît des conseils. Merci

5
prime

Le problème est que data est une variable globale et vous ajoutez une référence à data à quotations.

Lorsque la première valeur est poussée sur quotations, data et quotations[0] fait référence au même objet. Voici un exemple de ce qui se passe:

var a = {num: 1};
var b = a;
b.num = 2;
console.log(a.num); // prints 2

La même chose se produit lorsqu'un objet est poussé vers un tableau. quotations ne contient pas de copie de data, il contient une référence à data de sorte que la modification de data modifie également quotations. Pour résoudre ce problème, chaque élément de quotations doit faire référence à un objet de données différent. Cela peut être accompli en définissant data à l'intérieur de la fonction au lieu de l'extérieur.

Remplacer

var data = {};
$("#addquotation").click(function() {
    // populate data, Push to quotations
});

avec

$("#addquotation").click(function() {
    var data = {};
    // populate data, Push to quotations
});
1
afuous