// map
console.log([1, 2, 3, 4, 5].reduce((a, v) => {
a.push(v * v);
return a
},[]));
//filter
console.log([1, 2, 3, 3, 4, 5].reduce((a, v) => {
if (v > 3) {
a.push(v)
}
return a
}, []));
//max
console.log([1, 2, 3, 4, 5, 6].reduce((a, v) => {
return Math.max(a, v)
}, []));
//扁平化
console.log([1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5].reduce((a, v) => {
!a.includes(v) && a.push(v)
return a
}, []));
//数组扁平化

多个数组交换位置

[1, 2], ['a', 'b']
// [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] const xProd = (a,b)=>{
return a.reduce((acc,x)=>{
return acc.concat(b.map(y=>[x,y]))
},[])
}; 注意为了防止报错 return记得一些要写,第二个就是reduce返回的类型[]

一道比较复杂的题目

# 30s   unzipWith

reduce 对于二维数组的操作
console.log([[1, 10, 100], [2, 20, 200]].reduce(
(acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc)
,[[],[],[]]
));
其实比较难理解的点有两点
* (acc,val)=(fn,acc)
我们因为知道 let a=(1,3) //3
* reduce 第二个参数 是返回参数的类型, 如果你要返回的类型是
{},{{},{}},[],[[],[]]都是可以的, 这样就好理解啦
const unzipWith = (arr, fn) =>
arr
.reduce(
(acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
Array.from({
length: Math.max(...arr.map(x => x.length))
}).map(x => [])
)
.map(val => fn(...val)); // 这里不写就会报错,所有注意起始值要写 unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)); // [3, 30, 300]
关于Array.from不好理解看下面的

Array.from

[['a', 'b'], [1, 2], [true, false]]
变成
[['a', 1, true], ['b', 2, false]] //////////////////////////////////
const arrays = [['a', 'b'], [1,3, 2], [true, false]];
//先算生成的数组有几项
const a=Array.from({length: Math.max(...arrays.map(v => v.length))});
console.log(a); //[ undefined, undefined, undefined ]
const b=a.map((_,i)=>{
return Array.from({length:arrays.length},(_,k)=>{
// k 是array 数组的0,1,2 三次
return arrays[k][i]
})
});
console.log(b);

关于reduce很烦的报错

错误实例(直接报错)
arr.reduce((acc,item)=>{
return acc.push(item.id)
},[]) 正确实例
arr.reduce((acc,item)=>{
return (acc.push(item.id),acc)
},[])
或者
arr.reduce((acc,item)=>{
acc.push(item.id)
return acc
},[])

.......................................................................................................................................................##############.........................................................................................................................................................................................

reduce深入理解的更多相关文章

  1. 数组中的reduce 函数理解

    第一次见到reduce 是在js 的高级程序设计中,它的意思是把一个数组减少为一个数,举的例子是数组中元素的求和.它接受一个函数作为参数,函数又有两个参数,一个是prev, 前一个值,一个是next, ...

  2. Array.prototype.reduce 的理解与实现

    Array.prototype.reduce 是 JavaScript 中比较实用的一个函数,但是很多人都没有使用过它,因为 reduce 能做的事情其实 forEach 或者 map 函数也能做,而 ...

  3. 关于Array.reduce的理解与拓展

    2018年1月6日 首先我要感谢我的同事徒步上山看日出在我第一份实习的时候对我的指导,现在我也开始跟他一样开始养成写博客的习惯 现在开始讨论我遇到的第一个问题,这是我在看javascript高级程序设 ...

  4. 关于reduce的理解

    什么是reduce reduce这个词字面上来讲,大多称作“归约”,但这个词太专业了,以至于第一眼看不出来意思.我更倾向于解释为“塌缩”,这样就形象多了.对一个n维的情况进行reduce,就是将执行操 ...

  5. js数组中indexOf/filter/forEach/map/reduce详解

    今天在网上看到一篇帖子,如题: 出处:前端开发博客 (http://caibaojian.com/5-array-methods.html) 在ES5中一共有9个Array方法,分别是: Array. ...

  6. JS Array常用方法indexOf/filter/forEach/map/reduce详解

    Array共有九个方法   Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.protot ...

  7. ES5新特性:理解 Array 中增强的 9 个 API

    为了更方便的对JS中Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.index ...

  8. 分布式基础学习(2)分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...

  9. JavaScript数组方法--reduce、reduceRIght、reverse

    今天写的reduce是比较复杂的一个数组方法,其实在这之前我也用过reduce,可是每次用起来总感觉不那么顺手,主要还是因为不熟,对reduce本身不熟.首先reduce这个单词翻译为中文,不那么直观 ...

随机推荐

  1. .NET Core 下调用WebAPI

    前言 今天我们介绍多种客户端调用WebApi的方式,可以是原生写的,也可以借助.NET 框架下的其他HTTP库.我们一起来看看它们之间的一些异同吧- RestSharp 首先要介绍的就是这款REST ...

  2. maven 学习---Maven教程

    Apache Maven是一个软件项目管理和综合工具.基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件. 本教程将介绍如何使用Maven在Java开发,或任何其 ...

  3. sigaction信号处理

    1. sigaction int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); signu ...

  4. Java进程间通信学习

    转自:https://www.iteye.com/blog/polim-1278435 进程间通信的主要方法有:(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共 ...

  5. SpringCloud学习第三章-springcloud 父项目创建

    父项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  6. (原)堆叠hourglass网络

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11486185.html 论文: https://arxiv.org/abs/1603.06937 官 ...

  7. Linux小知识:CentOS使用Google-BBR加速网络

    准备一台centos的服务器查看系统内核:rpm -qa | grep kernel这里需要Linux内核在4.9 RC版本以上,如果版本不是请继续下面操作 访问https://elrepo.org/ ...

  8. LengthFieldBasedFrameDecoder

    LengthFieldBasedFrameDecoder 详解 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -31[ 博客园 总入口 ] 文章目录 LengthFieldBasedFr ...

  9. MySql日期格式化(format)取值范围

  10. Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持

    一.解决 “您的连接不是私密连接” 前一段时间,Chrome 突然显示出了“您的连接不是私密连接”,这下可难受了,大部分的网站打开都有问题. 找了各种方法,各种设置都是不行. 一.暴力.费力的方法直接 ...