function baseFlatten(array, isDeep, isStrict, result) {
	      result || (result = []);

	      var index = -1,
	          length = array.length;

	      while (++index < length) {
	        var value = array[index];
	        if (isObjectLike(value) && isArrayLike(value) &&
	            (isStrict || isArray(value) || isArguments(value))) {
	          if (isDeep) {
	            // Recursively flatten arrays (susceptible to call stack limits).
	            baseFlatten(value, isDeep, isStrict, result);
	          } else {
	            arrayPush(result, value);
	          }
	        } else if (!isStrict) {
	          result[result.length] = value;
	        }
	      }
	      return result;
	    }
The base implementation of `_.flatten` with added support for restricting
flattening and specifying the start index.

@private
@param {Array} array The array to flatten.
@param {boolean} [isDeep] Specify a deep flatten.
@param {boolean} [isStrict] Restrict flattening to arrays-like objects.
@param {Array} [result=[]] The initial result value.
@returns {Array} Returns the new flattened array.