JS-reduce 使用大全

• 定义:对数组中的每个元素执行一个自定义的累计器,将其结果汇总为单个返回值。
• 形式:arr.reduce( ( t, v, i, a) => {}, initValue)
• 参数:
• callback:回调函数
• initValue: 初始值
• 回调函数的参数
• total( t ): 累计器完成计算的返回值。
• value(v):当前元素
• index(i):当前元素的索引
• array(a):昂铅元素所属的数组对象
• 运行过程:以 t 作为累计结果的初始值,不设置t则以数组第一个元素为初始值。开始遍历。使用累计器处理v,将v的映射结果累计到t上,结束此循环,返回t。进入下一次循环,直到数组最后一个元素。结束遍历,返回最终的t。
1、作为累加器

const arr = [1,3,4,5,6]
const result = arr.reduce((t,v)=> t+v)
const result1 = arr.reduce((t,v)=> t * v)
console.log(result,result1)

2、权重求和

const scores = [
    { score: 90, subject: "chinese", weight: 0.5 },
    { score: 95, subject: "math", weight: 0.3 },
    { score: 85, subject: "english", weight: 0.2 }
];
let result = scores.reduce( (t,v) => {
    return t + v.score * v.weight
}, 0)
console.log(result)

3、数组反序

const arr = [1,2,3,4,5,6]
let result = arr.reduceRight ( (t,v) => {
    return t.push(v),t 
},[])
console.log(result)

4、实现map

const arr = [1,2,3,4,5,6]
let result = arr.reduce( (t, v) => {
    return t.push(v*2),t
},[])
console.log(result)

5、实现filter

const arr = [1,2,3,4,5,6]
let result = arr.reduce( (t, v) => {
    return v >= 3 ? [...t,v] : t
},[])
console.log(result)

6、实现some

const arr = [1,2,3,4,5,6,1]
let result = arr.reduce( (t, v) => {
    return t || v >= 4 ? true : false;
}, false)
console.log(result)

7、实现every

const arr = [1,2,3,4,5,6,1]
let result = arr.reduce( (t, v) => {
    return t && v >= 1 ? true : false;
}, true)
console.log(result)

8、数组分割

let arr = [1,2,3,4,5,6,7]
function chunk(arr, size){
    return arr.reduce( (t, v)=>{
        return t[t.length - 1].length === size ? t.push([v]) : t[t.length - 1 ].push(v),t
    },[[]])
}
console.log(chunk(arr, 2))

9、数组去重

let arr = [1,2,3,1,1,2,3,4,5]
let result = arr.reduce(( t, v )=> {
    return t.includes(v) ? t : t.push(v),t
},[])
console.log(result)

10、求最大值

let arr = [1,23,6,7,34,56,3,4,5,34]
let result = arr.reduce( (t, i) => {
    return t > i ? t : i
})
console.log(result)

11、数组成员统计

let arr = [1,3,4,5,2,1,2,3,1,2,1,23,4,34,23,3]
let result = arr.reduce( (t, v)=>{
    return t[v] ? {...t,[v]: ++t[v]} : {...t, [v]: 1}
},{})
console.log(result)
12、寻找对应数组的下标
let arr = [1,3,4,5,2,1,2,3,1,2,1,23,4,34,23,3]
function findIndexArr(arr, value) {
    let result = arr.reduce ( (t, v, i) => {
        return v === value && t.push(i),t
    },[])
    return result
}
console.log(findIndexArr(arr, 2))

13、数组特性分组

const arr = [
    { area: "GZ", name: "YZW", age: 27 },
    { area: "GZ", name: "TYJ", age: 25 },
    { area: "SZ", name: "AAA", age: 23 },
    { area: "FS", name: "BBB", age: 21 },
    { area: "SZ", name: "CCC", age: 19 }
]; // 以地区area作为分组依据  { GZ: Array(2), SZ: Array(2), FS: Array(1) }
function group(arr, key){
    return arr.reduce( (t, v) => {
        return !t[v[key]] && (t[v[key]] = []),t[v[key]].push(v),t
    }, {})
}
console.log(group(arr, 'area'))

14、字符串翻转

let str = '这是一段文本啦啦啦'
let result = str.split('').reduceRight( (t, v)=>{
    return t += v
},'')
console.log(result)

15、多为数组拍平。

let arr = [[1,2,3,[10,[22]]],4,[5,6,[7,9,8]]]
function flatArr (arr){
    return arr.reduce ( (t, v) => {
        if ( Object.prototype.toString.call(v) === '[object Array]') {
            t.push(...flatArr(v))
        }else {
            t.push(v)
        }
        return  t
     },[])
}
console.log(FlatArr(arr))
// 简化写法
function newFlatArr (arr){
    return arr.reduce ( (t, v) => {
        return  Array.isArray(v) ? (t.push(...flatArr(v)),t) : (t.push(v),t)
     },[])
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值