|
|
- 'use strict'
-
- /**
- * Expose `arrayFlatten`.
- */
- module.exports = flatten
- module.exports.from = flattenFrom
- module.exports.depth = flattenDepth
- module.exports.fromDepth = flattenFromDepth
-
- /**
- * Flatten an array.
- *
- * @param {Array} array
- * @return {Array}
- */
- function flatten (array) {
- if (!Array.isArray(array)) {
- throw new TypeError('Expected value to be an array')
- }
-
- return flattenFrom(array)
- }
-
- /**
- * Flatten an array-like structure.
- *
- * @param {Array} array
- * @return {Array}
- */
- function flattenFrom (array) {
- return flattenDown(array, [])
- }
-
- /**
- * Flatten an array-like structure with depth.
- *
- * @param {Array} array
- * @param {number} depth
- * @return {Array}
- */
- function flattenDepth (array, depth) {
- if (!Array.isArray(array)) {
- throw new TypeError('Expected value to be an array')
- }
-
- return flattenFromDepth(array, depth)
- }
-
- /**
- * Flatten an array-like structure with depth.
- *
- * @param {Array} array
- * @param {number} depth
- * @return {Array}
- */
- function flattenFromDepth (array, depth) {
- if (typeof depth !== 'number') {
- throw new TypeError('Expected the depth to be a number')
- }
-
- return flattenDownDepth(array, [], depth)
- }
-
- /**
- * Flatten an array indefinitely.
- *
- * @param {Array} array
- * @param {Array} result
- * @return {Array}
- */
- function flattenDown (array, result) {
- for (var i = 0; i < array.length; i++) {
- var value = array[i]
-
- if (Array.isArray(value)) {
- flattenDown(value, result)
- } else {
- result.push(value)
- }
- }
-
- return result
- }
-
- /**
- * Flatten an array with depth.
- *
- * @param {Array} array
- * @param {Array} result
- * @param {number} depth
- * @return {Array}
- */
- function flattenDownDepth (array, result, depth) {
- depth--
-
- for (var i = 0; i < array.length; i++) {
- var value = array[i]
-
- if (depth > -1 && Array.isArray(value)) {
- flattenDownDepth(value, result, depth)
- } else {
- result.push(value)
- }
- }
-
- return result
- }
|