function customForIn(objectForLoop, callbackfn) {
  var avoid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'prototype';
  var thisArg = arguments.length > 3 ? arguments[3] : undefined;
  var isInPrototype = Array.isArray(objectForLoop) ? function (key) {
    return Number.isNaN(Number(key));
  } : function (key) {
    return !(0,_has_own_property__WEBPACK_IMPORTED_MODULE_0__.default)(objectForLoop, key);
  };
  var avoidItems = Array.isArray(avoid);
  var jumps = avoidItems ? avoid.join(' ') : '';
  var pass = avoidItems || !avoid || avoid === 'prototype';
  var getPrototype = avoid.toString().indexOf('prototype') !== -1; // eslint-disable-next-line

  for (var propertyName in objectForLoop) {
    if (!(getPrototype && isInPrototype(propertyName)) && jumps.indexOf(propertyName) === -1 && pass === true) {
      var callbackfnCalled = callbackfn.call(thisArg, objectForLoop[propertyName], propertyName, objectForLoop);
      if (callbackfnCalled) return true;
    }

    if (!pass) pass = propertyName === avoid;
  }

  return false;
}
/**
 * Very similar to a "for in", however, it is optional go through the "prototype" and is more controllable.
 * @param objectForLoop
 * The object.
 *
 * @param callbackfn
 * A function that accepts up to three arguments. Calls the callbackfn function one time for each element in the array. If callbackfn returns any value that, if converted to boolean equals "true" the looping and terminating.
 *
 * @param avoid
 * A drive of "key" to jump or the key to start counting. The default value is "prototype" - ( avoiding the object's prototype reading ).
 *
 * @param thisArg
 * An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
 */
Very similar to a "for in", however, it is optional go through the "prototype" and is more controllable.
@param objectForLoop
The object.

@param callbackfn
A function that accepts up to three arguments. Calls the callbackfn function one time for each element in the array. If callbackfn returns any value that, if converted to boolean equals "true" the looping and terminating.

@param avoid
A drive of "key" to jump or the key to start counting. The default value is "prototype" - ( avoiding the object's prototype reading ).

@param thisArg
An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
Very similar to a " for in " however it is optional go through the " prototype " and is more controllable . @param objectForLoop The object . @param callbackfn A function that accepts up to three arguments . Calls the callbackfn function one time for each element in the array . If callbackfn returns any value that if converted to boolean equals " true " the looping and terminating . @param avoid A drive of " key " to jump or the key to start counting . The default value is " prototype " - ( avoiding the object ' s prototype reading ) . @param thisArg An object to which the this keyword can refer in the callbackfn function . If thisArg is omitted undefined is used as the this value .
function customForIn(objectForLoop, callbackfn) {
  var avoid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'prototype';
  var thisArg = arguments.length > 3 ? arguments[3] : undefined;
  var isInPrototype = Array.isArray(objectForLoop) ? function (key) {
    return Number.isNaN(Number(key));
  } : function (key) {
    return !(0,_has_own_property__WEBPACK_IMPORTED_MODULE_0__.default)(objectForLoop, key);
  };
  var avoidItems = Array.isArray(avoid);
  var jumps = avoidItems ? avoid.join(' ') : '';
  var pass = avoidItems || !avoid || avoid === 'prototype';
  var getPrototype = avoid.toString().indexOf('prototype') !== -1; 
  for (var propertyName in objectForLoop) {
    if (!(getPrototype && isInPrototype(propertyName)) && jumps.indexOf(propertyName) === -1 && pass === true) {
      var callbackfnCalled = callbackfn.call(thisArg, objectForLoop[propertyName], propertyName, objectForLoop);
      if (callbackfnCalled) return true;
    }
    if (!pass) pass = propertyName === avoid;
  }
  return false;
}
function customForIn ( objectForLoop , callbackfn ) { var avoid = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : 'prototype' ; var thisArg = arguments . length > 3 ? arguments [ 3 ] : undefined ; var isInPrototype = Array . isArray ( objectForLoop ) ? function ( key ) { return Number . isNaN ( Number ( key ) ) ; } : function ( key ) { return ! ( 0 , _has_own_property__WEBPACK_IMPORTED_MODULE_0__ . default ) ( objectForLoop , key ) ; } ; var avoidItems = Array . isArray ( avoid ) ; var jumps = avoidItems ? avoid . join ( ' ' ) : '' ; var pass = avoidItems || ! avoid || avoid === 'prototype' ; var getPrototype = avoid . toString ( ) . indexOf ( 'prototype' ) !== - 1 ; for ( var propertyName in objectForLoop ) { if ( ! ( getPrototype && isInPrototype ( propertyName ) ) && jumps . indexOf ( propertyName ) === - 1 && pass === true ) { var callbackfnCalled = callbackfn . call ( thisArg , objectForLoop [ propertyName ] , propertyName , objectForLoop ) ; if ( callbackfnCalled ) return true ; } if ( ! pass ) pass = propertyName === avoid ; } return false ; }
Very similar to a "for in", however, it is optional go through the "prototype" and is more controllable.
Very similar to a " for in " however it is optional go through the " prototype " and is more controllable .
// eslint-disable-next-line