// 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. Spring所有注解大揭秘

    声明bean的注解 @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @Controller 在 ...

  2. 关于html的相关讲解

    浏览器chrome Chrome它内部有一个解析器,这个解析器就是解析我们的代码,各个浏览器的内核不一样,所以存在浏览器的兼容.这个内核是一个引擎. 谷歌的内核是webkit 引擎是v8. 客户端的请 ...

  3. HTML实现百度分享插件分享网页

    一.HTML代码如下: <div class="bdsharebuttonbox"> <a href="#" class="bds_ ...

  4. “You don't have permission to access /phpmyadmin/ on this server.”

    <Directory "I:/1/wamp/apps/phpmyadmin3.4.10.1/"> Options Indexes FollowSymLinks Mult ...

  5. Cocos Creator (JavaScript手机类型判断)

    手机类型判断 var BrowserInfo = { userAgent: navigator.userAgent.toLowerCase() isAndroid: Boolean(navigator ...

  6. Global variable in ABAP function group

    Function group is loaded into runtime memory by the FIRST call of a function module inside this func ...

  7. nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理场景、nginx反向代理配置、nginx反向代理语法

    一.代理服务与反向代理 什么是代理服务 代理-代理办理(代理理财.代理收货.代理购物等等). 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forw ...

  8. Mycat高可用解决方案一(mysql安装)

    Mycat高可用解决方案一(mysql安装) Mycat关键特性 关键特性 支持SQL92标准 支持MySQL.Oracle.DB2.SQL Server.PostgreSQL等DB的常见SQL语法 ...

  9. PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件

    PHP  多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用:http://fex.baidu.com/webuploader/gett ...

  10. 《linux就该这么学》课堂笔记19 iSCSI、MariaDB、无人值守安装

    1.iSCSI技术介绍 硬盘是计算机硬件设备中重要的组成部分之一,硬盘存储设备读写速度的快慢也会对服务器的整体性能造成影响. 为了进一步提升硬盘存储设备的读写速度和性能,人们一直在努力改进物理硬盘设备 ...