docs: function (obj) {
      var result = {};
  
      var walk = function (obj, result, path, originObj) {
          if (!originObj) {
              var originObj = obj;
          }
          if (!path) {
              path = '';
          }
  
          if (_.isObject(obj) && !_.isArray(obj) && !_.isRegExp(obj) && !_.isFunction(obj)) {
              for (var value in obj) {
  
                  if (_.isObject(obj[value]) && !_.isArray(obj[value]) && !_.isFunction(obj[value]) && !_.isRegExp(obj[value]) && !_.isDate(obj[value])) {
                      var subPath = _.isEmpty(path) ? value : path + '.' + value;
                      /*var subPath;
  
                       if (_.isEmpty(path)) {
                       subPath = value;
                       }
                       else {
                       if (/^-?[\d.]+(?:e-?\d+)?$/.test(value)) {
                       subPath = path + '["' + value + '"]';
                       }
                       else {
                       subPath = path + '.' + value;
                       }
                       }*/
                      result = walk(obj[value], result, subPath, originObj);
                  }
                  else {
                      if (_.isArray(obj[value])) {
  
                          for (var subObj in obj[value]) {
  
  
                              if (typeof obj[value][subObj] != "object") {
                                  // Check if type object array or plain array
                                  if (path) {
                                      result[path + '.' + value] = obj[value];
                                  }
                                  else {
                                      if (!result[value]) {
                                          result[value] = [];
                                      }
                                      result[value] = obj[value];
                                  }
                              }
                              else {
                                  if (obj[value][subObj][0] && !_.isObject(obj[value][subObj][0])) {
                                      if (!result[value]) {
                                          result[value] = [];
                                      }
                                      result[value][subObj] = obj[value][subObj];
                                  }
                                  else {
                                      if (path) {
                                          // Check if is Array or Object
                                          if (!_.isArray(obj[value])) {
                                              if (!result[path]) {
                                                  result[path] = {};
                                              }
                                              if (!result[path][value]) {
                                                  result[path][value] = {};
                                              }
                                              result[path][value][subObj] = plainValues(obj[value][subObj]);
                                          }
                                          else {
                                              if (!result[path]) {
                                                  result[path] = {};
                                              }
                                              if (!result[path][value]) {
                                                  result[path][value] = [];
                                              }
                                              result[path][value].push(plainValues(obj[value][subObj]));
                                          }
                                      }
                                      else {
                                          if (!result[value]) {
                                              result[value] = [];
                                          }
                                          result[value][subObj] = plainValues(obj[value][subObj]);
                                      }
                                  }
                              }
                          }
  
  
                      }
                      else {
                          var pathName = path.replace('["', '.');
                          pathName = pathName.replace('"]', '');
  
                          if (path == '') {
                              try {
                                  result[value] = eval('originObj' + generateObjectPath(value) + '');
                              } catch (e) {
                              }
                          }
                          else {
                              try {
                                  result[pathName + '.' + value] = eval('originObj' + generateObjectPath(path) + '["' + value + '"]');
                              } catch (e) {
                              }
                          }
                      }
                  }
              }
          }
          return result;
      };
  
      var resultArray = walk(obj, result);
      return _.isEmpty(resultArray) ? false : resultArray;
  }