# unzip
# Description
unzip 的作用是接收一个二维数组 array,返回一个新的二维数组 result,result 中的第一个元素,是由 array 中所有的数组的第一个元素组成,result 的第二个元素,由 array 中所有数组的第二个元素组成,依此类推。
这个方法类似于 zip,除了它接收分组元素的数组,并且创建一个数组,分组元素到打包前的结构。(:返回数组的第一个元素包含所有的输入数组的第一元素,第一个元素包含了所有的输入数组的第二元素,依此类推。)
# Params
array
# Return
Array
# Depend
import filter from './filter.js'
import map from './map.js'
import baseProperty from './.internal/baseProperty.js'
import isArrayLikeObject from './isArrayLikeObject.js'
filter 源码分析
map 源码分析
baseProperty 源码分析
isArrayLikeObject 源码分析
# Code
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
}
# Analyze
首先对于空参数的处理,如果 array 不是一个有值的数组的话,返回一个空数组
拿到结果数组的长度
let length = 0 array = filter(array, (group) => { if (isArrayLikeObject(group)) { length = Math.max(group.length, length) return true } })
unzip 传入的参数是一个二维数组,结果是 二维数组每一个索引对应的值
[[1,2,3,], [4,5,6], [7,8,9]] // => [1,4,7], [2,5,8], [3,6,9]
所以这里首先判断每一项是否为一个类数组对象,在通过 Math.max 来更新 length 值
遍历完成后,首先过滤掉了不是数组的值,其实得到了最终结果的 长度
根据的到的
length
初始化Array
,while
循环遍历, 通过map
拿到当前 索引对应的值数组
# Example
console.log(unzip([[1,2,3], [4,5,6],[7,8,9]])) // [ [ 1, 4, 7 ], [ 2, 5, 8 ], [ 3, 6, 9 ] ]