function getDeepProperty(obj, keys) {
  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
      _ref$throwError = _ref.throwError,
      throwError = _ref$throwError === undefined ? false : _ref$throwError,
      backup = _ref.backup;

  if (isString(keys)) {
    keys = keys.split('.');
  }
  if (!isArray(keys)) {
    throw new TypeError('keys of getDeepProperty must be string or Array<string>');
  }
  var read = [];
  var target = obj;
  for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    if (isVoid(target)) {
      if (throwError) {
        throw new Error('obj' + (read.length > 0 ? '.' + read.join('.') : ' itself') + ' is ' + target);
      } else {
        return backup;
      }
    }
    target = target[key];
    read.push(key);
  }
  return target;
}
function getDeepProperty(obj, keys) {
  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
      _ref$throwError = _ref.throwError,
      throwError = _ref$throwError === undefined ? false : _ref$throwError,
      backup = _ref.backup;

  if (isString(keys)) {
    keys = keys.split('.');
  }
  if (!isArray(keys)) {
    throw new TypeError('keys of getDeepProperty must be string or Array<string>');
  }
  var read = [];
  var target = obj;
  for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    if (isVoid(target)) {
      if (throwError) {
        throw new Error('obj' + (read.length > 0 ? '.' + read.join('.') : ' itself') + ' is ' + target);
      } else {
        return backup;
      }
    }
    target = target[key];
    read.push(key);
  }
  return target;
}
function getDeepProperty ( obj , keys ) { var _ref = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : { } , _ref$throwError = _ref . throwError , throwError = _ref$throwError === undefined ? false : _ref$throwError , backup = _ref . backup ; if ( isString ( keys ) ) { keys = keys . split ( '.' ) ; } if ( ! isArray ( keys ) ) { throw new TypeError ( 'keys of getDeepProperty must be string or Array<string>' ) ; } var read = [ ] ; var target = obj ; for ( var i = 0 , len = keys . length ; i < len ; i ++ ) { var key = keys [ i ] ; if ( isVoid ( target ) ) { if ( throwError ) { throw new Error ( 'obj' + ( read . length > 0 ? '.' + read . join ( '.' ) : ' itself' ) + ' is ' + target ) ; } else { return backup ; } } target = target [ key ] ; read . push ( key ) ; } return target ; }
get an deep property
get an deep property