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
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
});