code: function objReduceIterated(iterationFunc, callback) {
      let reduced = arguments[2];
      let first = arguments.length <= 2;
      iterationFunc.call(this, (value, key, src) => {
          if (first) {
              reduced = value;
              first = false;
          } else {
              BREAK.setDefault(reduced);
              const result = callback.call(UNDEFINED, reduced, value, key, src);
              if (result === BREAK) {
                  reduced = BREAK.returned;
                  return BREAK;
              }
              reduced = result;
          }
      });
  
      if (first) {
          throw new TypeError("Reduce of empty array with no initial value");
      }
      return reduced;
  }
docs: reduce function applied to object's and array's own properties not just indexed contents
  where order of reduction is not important
  
  @this        array or object
  @param iterationFunc function to use for iteration, will be called on this arg
  @param callback function taking (prevValue, value, key, collection) and returning reduced
  value if BREAK returned then the result will be the accumulated value up to this point,
  or if BREAK(arg) is returned then the result will be arg
  //@param initialValue what to use for initial reduced value instead of array element
  @return {boolean} whether callback returned true for all keys/values