Question

My object literal has an info property with a value that is an array. I'm trying to push new data into that array, using an each function on the object literal to make sure I'm updating the correct goal.

Here's a fiddle: http://jsfiddle.net/charliemagee/ZZwnN/

Console shows Uncaught TypeError: Object ['66','77'] has no method 'push'

But the previous console.log shows that it is an array, so push should work, right?

Here's a section of the object literal.

goals = {

  "9e693231-e6d8-4ca9-b5c8-81ea7a8dd54": {
    category: "school",
    datecreated: "2013-10-20",
    goal: "keep locker tidy",
    icon: "clipboard",
    status: "inprogress",
    infotype: "text",
    info: "['66','77']",
    recurring: "mon,wed,fri",
    complete: "Great Job!",
    deadline: "2014-1-20",
    username: "maryjones",
    userguid: "0c7270bd-38e8-4db2-ae92-244de019mju7"
  }
}

And here's the function that's supposed to push the array.

$(".goalsinprogress").delegate("input[type=checkbox]", "click", function() {
  goalguid = $(this).parent().parent().data("goalguid");
  emailGoal = $(this).parent().data('goal');
  newinfo = $(this).closest('li').find('input[type="text"]').val();
  $(this).parent().parent().removeClass("inprogress missed").addClass("completed").prop("checked", true);
  updateStatus = 'completed';
  $.each(goals, function(index, goal) {
    if (index === goalguid) {
      console.log(goal.info); // shows that goal.info is an array
      goal.info.push(newinfo); // gives me the error
      console.log(goal.info);
      goal.status = updateStatus;
      return false;
    }
  });
  localStorage.setItem("goals", JSON.stringify(goals));
  $(this).find('.info').hide();
  $(this).find('.info').val('');
  return displayMyGoalList();
});
Was it helpful?

Solution

If you change the console log to console.log(typeof(goal.info)); you'll see it is a string, not an array. Remove the quotes and it works fine:

  "9e693231-e6d8-4ca9-b5c8-81ea7a8dd54": {
    category: "school",
    datecreated: "2013-10-20",
    goal: "keep locker tidy",
    icon: "clipboard",
    status: "inprogress",
    infotype: "text",
    info: ['66','77'],  // no quotes here
    recurring: "mon,wed,fri",
    complete: "Great Job!",
    deadline: "2014-1-20",
    username: "maryjones",
    userguid: "0c7270bd-38e8-4db2-ae92-244de019mju7"
  },
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top