code: function(structure, data){
      var out = {}, nameOrHash;
  
      for (var i = 0, len1 = structure.length; i < len1; i++){
  
       // e.g., nameOrHash is either 'id' or {hand: [...]}
       nameOrHash = structure[i];
  
       if ( typeof  nameOrHash === 'string'){
  
         out[nameOrHash] = data[i];
  
       }else if (Object.prototype.toString.call(nameOrHash) == "[object Array]") {
         // nested array, such as hands or fingers
         // nameOrHash ["id", "direction", "palmNormal", "palmPosition", "palmVelocity"]
         // data [ [ 31, [vec3], [vec3], ...] ]
  
         var subArray = [];
  
         for (var j = 0, len2 = data.length; j < len2; j++){
           subArray.push(
             this.unPackArray(
               nameOrHash,
               data[j]
             )
           );
         }
         return subArray;
  
       } else { // key-value (nested object) such as interactionBox
  
         for (var key in nameOrHash) break;
  
         out[key] = this.unPackArray(
           nameOrHash[key],
           data[i]
         );
  
       }
  
      }
  
      return out;
    }
docs: data is a frame or subset of frame returns a frame object this is the structure of the array gets unfolded to key-value pairs e.g.: this.packingStructure = [ 'id', 'timestamp', {hands: [[ 'id', 'direction', 'palmNormal', 'palmPosition', 'palmVelocity' ]]}, {pointables: [[ 'direction', 'handId', 'length', 'stabilizedTipPosition', 'tipPosition', 'tipVelocity', 'tool' ]]}, {interactionBox: [ 'center', 'size' ]} ];