输出:数组 , 函数 / 属性
输入:对象,其中key
:数组所有元素通过解决后的值,value
:雷同 key 的数组元素汇合
eg: 输出 [6.1,4.2,6.3],Math.floor
输入{4: [4.2], 6: [6.1,6.3]}
输出:['one','two','three'],'length'
输入:{3:['one','two'], 5:['three']}
法 1:map+reduce
reduce()
办法对数组中的每个元素执行用户定义的 reduce
函数
arr.reduce(function(prev,cur,index,arr){...}, init);
prev
必须。上一次调用回调时的返回值 ,或者初始值init
;cur
必须。示意 以后正在解决的数组元素 ;index
可选。示意 以后正在解决的数组元素的索引 ,若提供init
值,则起始索引为 0
,否则起始索引为1
; 简略来说就是,不设置 init,则从第二个元素开始循环,设置了就从第一个开始循环,pre 就是 initarr
可选。示意 原数组 ;init
可选。示意 初始值。
法 2:应用字典map
function groupBy(arr, fn) {let map = new Map()
arr.forEach(item => {
let key = null
if (typeof fn === 'function') {key = fn(item)
} else {key = item[fn]
}
let value = item
if (map.has(key)) {map.set(key, [...map.get(key), value])
} else {map.set(key, [value])
}
})
let result = {}
for (let [key, value] of map) {result[key] = value
}
return result
}
let arr1 = ['one', 'two', 'three']
console.log(groupBy(arr1, 'length'))
let arr2 = [6.1, 4.2, 6.3]
console.log(groupBy(arr2, Math.floor))