javascript 中filter、map、reduce链式调用及使用方式

最近使用数组操作方法比较多,发现这三个函数可以配合一起使用,会很简洁和方便顺便记录分享一下:

举个简单栗子:

const data = [
    {
        name:'apple',
        rate:0.8,
        type:'fruit'
    },
    {
        name:'banana',
        rate:0.62,
        type:'fruit'
    },
    {
        name:'bread',
        rate:0.74,
        type:'food'
    },
    {
        name:'orange',
        rate:0.53,
        type:'fruit'
    }
];

const ret = data.filter(item => item.type =='fruit')
                .map(item => item.rate * 100)
                .reduce((pre,cur)=> pre + cur,0);
console.log(ret)

这里主要是先用filter过滤所有水果类型的元素,然后通过map将元素占比乘以100,最后用reduce求和得到结果

下面介绍下这三个函数的具体使用方法:

filter:过滤数组中的值,返回一个新数组 不会修改原数组的值 

例如: 

const arr = [10,20,8,6,19];
const ret = arr.filter(item => item > 10);//过滤出大于10的元素 放到一个新数组里面
console.log(ret)//[20,19]

 map:对数组中的每一项元素进行操作 然后返回操作后的元素到一个新数组中 不改变原数组

例如:

const arr = [10,20,30,40];
const ret = arr.map(item => item*10);
console.log(ret)//[ 100, 200, 300, 400 ]

reduce:归并方法 对数组每一项累加求和也可用来数组去重

数组求和:

 这里的初始值设置为1 累计求和后得到16 pre是初始值  cur为当前项的值

let num1 = [1,2,3,4,5]
let num2 = num1.reduce((pre,cur)=>{
    return pre + cur 
},1)
console.log(num2) // 16

数组去重:

// 数组去重
const arr = [12,33,15,12,8,45,33,12,8];
const ret = arr.reduce((pre,cur)=>{
    console.log(pre,'pre')
    if(pre.includes(cur)){
        return pre
    }else {
        return [...pre,cur]
    }
},[])
console.log(ret) //[ 12, 33, 15, 8, 45 ]

这里的pre初始值是个空数组,每次累计的时候都会往这个数组里面放去重后的元素,打印出的pre结果为

利用reduce将二维数组转换为一维数组:

//二维数组转换成一维数组
const arr = [
    [12,10],
    [4,8,19],
    [22,44]
];
const ret = arr.reduce((pre,cur)=>{
    return [...pre,...cur]
},[]);
console.log(ret) //[12, 10,  4, 8,19, 22, 44]

计算数组中元素出现次数:

const arr = ['ab','bb','bc','dd','ab','bb','aa','aa','dd'];
const ret = arr.reduce((pre,cur)=>{
    if(cur in pre){//当前值在pre对象属性中则加1
        pre[cur]++;
    }else {//pre对象属性中不存在当前值则给1
        pre[cur] = 1;
    }
    return pre;
},{});

console.log(ret) //{ ab: 2, bb: 2, bc: 1, dd: 2, aa: 2 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值