Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
43 lines (41 sloc)
1.15 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import filter from './filter.js' | |
import map from './map.js' | |
import baseProperty from './.internal/baseProperty.js' | |
import isArrayLikeObject from './isArrayLikeObject.js' | |
/** | |
* This method is like `zip` except that it accepts an array of grouped | |
* elements and creates an array regrouping the elements to their pre-zip | |
* configuration. | |
* | |
* @since 1.2.0 | |
* @category Array | |
* @param {Array} array The array of grouped elements to process. | |
* @returns {Array} Returns the new array of regrouped elements. | |
* @see unzipWith, zip, zipObject, zipObjectDeep, zipWith | |
* @example | |
* | |
* const zipped = zip(['a', 'b'], [1, 2], [true, false]) | |
* // => [['a', 1, true], ['b', 2, false]] | |
* | |
* unzip(zipped) | |
* // => [['a', 'b'], [1, 2], [true, false]] | |
*/ | |
function unzip(array) { | |
if (!(array != null && array.length)) { | |
return [] | |
} | |
let length = 0 | |
array = filter(array, (group) => { | |
if (isArrayLikeObject(group)) { | |
length = Math.max(group.length, length) | |
return true | |
} | |
}) | |
let index = -1 | |
const result = new Array(length) | |
while (++index < length) { | |
result[index] = map(array, baseProperty(index)) | |
} | |
return result | |
} | |
export default unzip |