63 lines
1.2 KiB
JavaScript
63 lines
1.2 KiB
JavaScript
|
/**
|
||
|
* Takes any input and guarantees an array back.
|
||
|
*
|
||
|
* - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
|
||
|
* - Converts `undefined` to an empty array.
|
||
|
* - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
|
||
|
* - Ignores input which is already an array.
|
||
|
*
|
||
|
* @module array-back
|
||
|
* @example
|
||
|
* > const arrayify = require('array-back')
|
||
|
*
|
||
|
* > arrayify(undefined)
|
||
|
* []
|
||
|
*
|
||
|
* > arrayify(null)
|
||
|
* [ null ]
|
||
|
*
|
||
|
* > arrayify(0)
|
||
|
* [ 0 ]
|
||
|
*
|
||
|
* > arrayify([ 1, 2 ])
|
||
|
* [ 1, 2 ]
|
||
|
*
|
||
|
* > arrayify(new Set([ 1, 2 ]))
|
||
|
* [ 1, 2 ]
|
||
|
*
|
||
|
* > function f(){ return arrayify(arguments); }
|
||
|
* > f(1,2,3)
|
||
|
* [ 1, 2, 3 ]
|
||
|
*/
|
||
|
|
||
|
function isObject (input) {
|
||
|
return typeof input === 'object' && input !== null
|
||
|
}
|
||
|
|
||
|
function isArrayLike (input) {
|
||
|
return isObject(input) && typeof input.length === 'number'
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {*} - The input value to convert to an array
|
||
|
* @returns {Array}
|
||
|
* @alias module:array-back
|
||
|
*/
|
||
|
function arrayify (input) {
|
||
|
if (Array.isArray(input)) {
|
||
|
return input
|
||
|
}
|
||
|
|
||
|
if (input === undefined) {
|
||
|
return []
|
||
|
}
|
||
|
|
||
|
if (isArrayLike(input) || input instanceof Set) {
|
||
|
return Array.from(input)
|
||
|
}
|
||
|
|
||
|
return [input]
|
||
|
}
|
||
|
|
||
|
export default arrayify
|