areJumpsValid()

by ParanoidAndroid77

HTML

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<div class="result">

</div>

JavaScript

//multiple answers types
 var MULTIPLE_ANSWER_TYPES = [
   'radio',
   'checkbox',
   'dropdown'
 ];

 function hasSameProps(validSource, wannaBe, strict) {

   var self = this;

   //false when wannabe property is an array but validSource is not
   if (typeof validSource === 'object' && Array.isArray(wannaBe)) {
     return false;
   }

   //check for wannaBe overlapping props
   if (!Object.keys(wannaBe).every(function(key) {
       return validSource.hasOwnProperty(key);
     })) {
     // console.log('wannaBe has extra keys')
     return false;
   }

   //check every key for being same
   return Object.keys(validSource).every(function(key) {
     //if object
     if (typeof validSource[key] === 'object' && typeof wannaBe[key] === 'object') {

       //check array is array
       if (Array.isArray(validSource[key])) {
         //console.log('must be array key: ' + key);
         return Array.isArray(wannaBe[key]);
       } else {
         //recursively check nested object
         return self.hasSameProps(validSource[key], wannaBe[key]);
       }

     } else {
       //check every key is present in the wanna be object
       if (wannaBe[key] === undefined) {
         // console.log('wannaBe does not have key:' + key)
         return false;
       }

       //check the type of value is the same (not the actual value, which can be different)
       if (strict) {
         if (typeof validSource[key] !== typeof wannaBe[key]) {
           //console.log('wannaBe type is wrong for key: ' + key)
           return false;
         }
       }

       return true;
     }
   });
 }

 function areJumpsValid(input) {

   var jumps = input.jumps;
   var are_valid = true;
   var possible_answers = input.possible_answers;
   var validJumpStructure = {
     to: '',
     when: '',
     answer_ref: ''
   };

   if (!$.isArray(jumps)) {
     are_valid = false;
   } else {
     $(jumps).each(function(index, jump) {

       var answer_ref_found = false;

       //validate structure
...