Sam Craven
Sam Craven

Reputation: 119

JavaScript for loop adding objects to objects

I have an array (data) formatted like so:

["1", "open_order", "form", "county", "San Diego", "title_officer", "Peter", "0"]
["2", "open_order", "form", "county", "San Diego", "branch", "MV", "0"]

When I put this through a for loop and add it to the dataObject, console.log(dataObject) gives me all of the entries (this is what I want!) However, console.log(o) shows that the last entry is going into the o object for both records.

$(function() {
  var o = {};
  var dataObject = {};
  var i = 0;
  var predata = $('#preferences').text();
  var data = JSON.parse(predata);
    for(i = 0; i < data.length; i++) {
      dataObject['preferenceId'] = data[i][0];
      dataObject['pageName'] = data[i][1];
      dataObject['preferenceType'] = data[i][2];
      dataObject['baseField'] = data[i][3];
      dataObject['baseValue'] = data[i][4];
      dataObject['targetField'] = data[i][5];
      dataObject['targetValue'] = data[i][6];
      dataObject['conditionalId'] = data[i][7];
        o[i] = dataObject;
        console.log(dataObject);
    }
  console.log(o);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Any ideas why dataObject would be the same for all objects added to the o object?

Upvotes: 4

Views: 5873

Answers (1)

Eddie
Eddie

Reputation: 26844

You should init the dataObject inside the loop to make a new variable.

for(i = 0; i < data.length; i++) {
    var dataObject = {}; /* Init the variable here */
    dataObject['preferenceId'] = data[i][0];
    dataObject['pageName'] = data[i][1];
    dataObject['preferenceType'] = data[i][2];
    dataObject['baseField'] = data[i][3];
    dataObject['baseValue'] = data[i][4];
    dataObject['targetField'] = data[i][5];
    dataObject['targetValue'] = data[i][6];
    dataObject['conditionalId'] = data[i][7];
    o[i] = dataObject;
    onsole.log(dataObject);
}

This will result to:

0: {
    baseField: "county",
    baseValue: "San Diego",
    conditionalId: "0",
    pageName: "open_order",
    preferenceId: "1",
    preferenceType: "form",
    targetField: "title_officer",
    targetValue: "Peter"
}
    1: {
    baseField: "county",
    baseValue: "San Diego",
    conditionalId: "0",
    pageName: "open_order",
    preferenceId: "2",
    preferenceType: "form",
    targetField: "branch",
    targetValue: "MV",
}

The reason why all of the values on the final array is the same is that, you are just assigning the dataObject by reference and you are not making a new variable.

Upvotes: 6

Related Questions