reduce深入理解
// 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深入理解的更多相关文章
- 数组中的reduce 函数理解
第一次见到reduce 是在js 的高级程序设计中,它的意思是把一个数组减少为一个数,举的例子是数组中元素的求和.它接受一个函数作为参数,函数又有两个参数,一个是prev, 前一个值,一个是next, ...
- Array.prototype.reduce 的理解与实现
Array.prototype.reduce 是 JavaScript 中比较实用的一个函数,但是很多人都没有使用过它,因为 reduce 能做的事情其实 forEach 或者 map 函数也能做,而 ...
- 关于Array.reduce的理解与拓展
2018年1月6日 首先我要感谢我的同事徒步上山看日出在我第一份实习的时候对我的指导,现在我也开始跟他一样开始养成写博客的习惯 现在开始讨论我遇到的第一个问题,这是我在看javascript高级程序设 ...
- 关于reduce的理解
什么是reduce reduce这个词字面上来讲,大多称作“归约”,但这个词太专业了,以至于第一眼看不出来意思.我更倾向于解释为“塌缩”,这样就形象多了.对一个n维的情况进行reduce,就是将执行操 ...
- js数组中indexOf/filter/forEach/map/reduce详解
今天在网上看到一篇帖子,如题: 出处:前端开发博客 (http://caibaojian.com/5-array-methods.html) 在ES5中一共有9个Array方法,分别是: Array. ...
- JS Array常用方法indexOf/filter/forEach/map/reduce详解
Array共有九个方法 Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.protot ...
- ES5新特性:理解 Array 中增强的 9 个 API
为了更方便的对JS中Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.index ...
- 分布式基础学习(2)分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...
- JavaScript数组方法--reduce、reduceRIght、reverse
今天写的reduce是比较复杂的一个数组方法,其实在这之前我也用过reduce,可是每次用起来总感觉不那么顺手,主要还是因为不熟,对reduce本身不熟.首先reduce这个单词翻译为中文,不那么直观 ...
随机推荐
- 微服务架构 ------ DockerCompose从安装到项目部署
DockerCompose的目的:简化Docker的启动和停止流程,以及编排Docker启动服务与服务之间的关系 DockerCompose的安装:curl -L https://get.daoclo ...
- [Vscode插件] 自动编译项目中的Sass文件为CSS
插件名 : Live Sass Compiler 今天在VSCode中发现了一个自动watch项目目录下sass文件的插件,摆脱了在控制台中进行手动watch的繁琐. 安装好以后点击右下角即可自动编译 ...
- tp5.0在控制器中和在模板中调用配置文件中的常量
框架配置文件config.php中定义 'view_replace_str' => [ '__MEMBER__'=> '/static/member', '__uplo ...
- CentOS7 firewalld防火墙规则
在CentOS7里有几种防火墙共存:firewalld.iptables.ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等. f ...
- bokeh 中 ValueError: Unrecognized range input: 解决方法
bokeh_data.index =bokeh_data.index.astype(np.str) 将其转换为字符型
- notepad++ 设置运行python脚本
按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...
- shell中if语句的使用
转载于:https://www.cnblogs.com/aaronLinux/p/7074725.html bash中如何实现条件判断?条件测试类型: 整数测试 字符测试 文件测试 ...
- 大数据技术原理与应用【第五讲】NoSQL数据库:5.6 文档数据库MongoDB
文档数据库介于关系数据库和NoSql之间: 是最像关系数据库的一款产品,也是当前最热门的一款产品. 1.MongoDB简介: 1) 2)文档类型BSON(Binary JSON),结构类似 ...
- linux之shell脚本学习(一)
#!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; ...
- 第03节-BLE协议各层数据格式概述
本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...