65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| /**
 | |
|  * Expose `arrayFlatten`.
 | |
|  */
 | |
| module.exports = arrayFlatten
 | |
| 
 | |
| /**
 | |
|  * Recursive flatten function with depth.
 | |
|  *
 | |
|  * @param  {Array}  array
 | |
|  * @param  {Array}  result
 | |
|  * @param  {Number} depth
 | |
|  * @return {Array}
 | |
|  */
 | |
| function flattenWithDepth (array, result, depth) {
 | |
|   for (var i = 0; i < array.length; i++) {
 | |
|     var value = array[i]
 | |
| 
 | |
|     if (depth > 0 && Array.isArray(value)) {
 | |
|       flattenWithDepth(value, result, depth - 1)
 | |
|     } else {
 | |
|       result.push(value)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return result
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Recursive flatten function. Omitting depth is slightly faster.
 | |
|  *
 | |
|  * @param  {Array} array
 | |
|  * @param  {Array} result
 | |
|  * @return {Array}
 | |
|  */
 | |
| function flattenForever (array, result) {
 | |
|   for (var i = 0; i < array.length; i++) {
 | |
|     var value = array[i]
 | |
| 
 | |
|     if (Array.isArray(value)) {
 | |
|       flattenForever(value, result)
 | |
|     } else {
 | |
|       result.push(value)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return result
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Flatten an array, with the ability to define a depth.
 | |
|  *
 | |
|  * @param  {Array}  array
 | |
|  * @param  {Number} depth
 | |
|  * @return {Array}
 | |
|  */
 | |
| function arrayFlatten (array, depth) {
 | |
|   if (depth == null) {
 | |
|     return flattenForever(array, [])
 | |
|   }
 | |
| 
 | |
|   return flattenWithDepth(array, [], depth)
 | |
| }
 |