109 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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
 | |
| }
 |