关于算法:对数组按指定特征进行分组

输出:数组函数/属性
输入:对象,其中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就是init
arr可选。示意原数组
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))

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理