You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
1.9 KiB
108 lines
1.9 KiB
'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 |
|
}
|
|
|