I have encountered one of the most bizzare and frustrating behaviours yet. I have sample data:
var nodes = [ //Sample data
  {
    ID: 1,
    Chart: 1,
    x: 50,
    y: 50,
    width: 100,
    height: 80,
    color: "#167ee5",
    text: "Start",
    label: "Start",
    targets: [2]
  },
  {
    ID: 2,
    Chart: 1,
    x: 500,
    y: 170,
    width: 100,
    height: 80,
    color: "#167ee5",
    text: "End",
    label: "End",
    targets: [3]
  },
  {
    ID: 3,
    Chart: 1,
    x: 270,
    y: 350,
    width: 100,
    height: 80,
    color: "#167ee5",
    text: "Mid",
    label: "Mid",
    targets: []
  }
];
for my web application. The issue is with the targets attribute. As you can see it is array. However when I do
console.log(nodes[0]);
and inspect the result in the browser it shows that the value for targets at index 0 is undefined. Same for every other targets that has some values in them (whether 1 or more).
However if I do
console.log(nodes.[0].targets);
it prints out [2]. If I do Array.isArray(nodes[0].targets) it returns false, yet if I do console.log(nodes[0]) and inspect the result in the browser console, it shows that the object prototype is in fact Array and simply the value at index 0 is undefined.
It worked the day before and now it doesn't. The only thing I did was I restructured the object that uses this variable later. But the console log is being called before the object is even instantiated for the first time (and it doesn't change the nodes var anyway, only reads it).
Does anyone have any clues as to what might be causing this behaviour. If it helps I am using Paperscript and this code runs in the paperscript scope (as it did before when everything worked fine).
UPDATE
Ok after more blind debugging I have determined the block of code that causes the issue, how or why is completely beyond me.
Basically I define an object constructor beflow. The constructor loops through the nodes, makes Paperscript shapes and adds the targets to the arbitrary data attribute of the paperJS path object:
function Flowchart(nodes, chartdata) {
  //Member vars. They are only used internally
  var connections = [];
  var shapes = [];
  var connectors = [];
  //Constructor operations
  createShapes(nodes); //If I uncomment this, the problem goes away
  //...
  function createShapes(nodes) {
    nodes.forEach(function (node) { //for each node data entry
      console.log(node); //At this point, the targets are screwed up already
      var point = new Point(node.x, node.y); //make a PaperJS point for placement
      var size = new Size(node.width, node.height); //make a PaperJS size object
      var shape = makeRectangle(point, size, 8, node.color); //Pass to the object instantiating function
      shape.data = { //Store arbitrary data for programming reference.
        ID: node.ID,
        label: node.label,
        text: node.text,
        'connectors': {
          to: [],
          from: []
        },
        targets: node.targets //this is undefined
      };
      console.log(node.targets) //this logs [2] or [3] but not Array[1]...
      shapes.push(shape); //Store reference for later
    });
    shapes.forEach(function (shape) { //loop though all drawn objects
      if (shape.data.targets.length > 0) { //if shape has targets
        var targets = _.filter(this.shapes, function (target) {
          return _.contains(shape.data.targets, target.data.ID);
        });
        for (var i = 0; i < shape.data.targets.length; i++) {
          shape.data.targets[i] = targets[i]; //Replace the ID-type reference with drawn object reference
        }
      }
     });
    }
     //... The rest of the object
    }
    console.log(nodes); 
    //It doesnt seem to matter whether i put this before or after instantiating. 
    //It doesnt even matter IF I instantiate in the first place.
    var chart = new Flowchart(nodes, chartdata);
 
    