1 var arrayPush = require('./arrayPush'),
2 isArguments = require('../lang/isArguments'),
3 isArray = require('../lang/isArray'),
4 isArrayLike = require('./isArrayLike'),
5 isObjectLike = require('./isObjectLike');
8 * The base implementation of `_.flatten` with added support for restricting
9 * flattening and specifying the start index.
12 * @param {Array} array The array to flatten.
13 * @param {boolean} [isDeep] Specify a deep flatten.
14 * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
15 * @param {Array} [result=[]] The initial result value.
16 * @returns {Array} Returns the new flattened array.
18 function baseFlatten(array, isDeep, isStrict, result) {
19 result || (result = []);
22 length = array.length;
24 while (++index < length) {
25 var value = array[index];
26 if (isObjectLike(value) && isArrayLike(value) &&
27 (isStrict || isArray(value) || isArguments(value))) {
29 // Recursively flatten arrays (susceptible to call stack limits).
30 baseFlatten(value, isDeep, isStrict, result);
32 arrayPush(result, value);
34 } else if (!isStrict) {
35 result[result.length] = value;
41 module.exports = baseFlatten;