| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize underscore exports="node" -o ./underscore/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var isArguments = require('../objects/isArguments'), |
| isArray = require('../objects/isArray'); |
| |
| /** |
| * The base implementation of `_.flatten` without support for callback |
| * shorthands or `thisArg` binding. |
| * |
| * @private |
| * @param {Array} array The array to flatten. |
| * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level. |
| * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects. |
| * @param {number} [fromIndex=0] The index to start from. |
| * @returns {Array} Returns a new flattened array. |
| */ |
| function baseFlatten(array, isShallow, isStrict, fromIndex) { |
| var index = (fromIndex || 0) - 1, |
| length = array ? array.length : 0, |
| result = []; |
| |
| while (++index < length) { |
| var value = array[index]; |
| |
| if (value && typeof value == 'object' && typeof value.length == 'number' |
| && (isArray(value) || isArguments(value))) { |
| // recursively flatten arrays (susceptible to call stack limits) |
| if (!isShallow) { |
| value = baseFlatten(value, isShallow, isStrict); |
| } |
| var valIndex = -1, |
| valLength = value.length, |
| resIndex = result.length; |
| |
| result.length += valLength; |
| while (++valIndex < valLength) { |
| result[resIndex++] = value[valIndex]; |
| } |
| } else if (!isStrict) { |
| result.push(value); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseFlatten; |