Javascript中内建函数reduce的应用详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript中内建函数reduce的应用详解相关的知识,希望对你有一定的参考价值。

参考技术A 前言
一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实现,虽然不清楚浏览器的js引擎是如何在C++层面实现这两个方法,但是可以肯定的是reduce方法肯定也存在数组的遍历,在具体实现细节上是否针对数组项的操作和存储做了什么优化,则不得而知。
数组的reduce方法的应用
reduce方法有两个参数,第一个参数是一个callback,用于针对数组项的操作;第二个参数则是传入的初始值,这个初始值用于单个数组项的操作。需要注意的是,reduce方法返回值并不是数组,而是形如初始值的经过叠加处理后的操作。
reduce方法最常见的场景就是叠加。
var
items
=
[10,
120,
1000];
//
our
reducer
function
var
reducer
=
function
add(sumSoFar,
item)

return
sumSoFar
+
item;
;
//
do
the
job
var
total
=
items.reduce(reducer,
0);
console.log(total);
//
1130
可以看出,reduce函数根据初始值0,不断的进行叠加,完成最简单的总和的实现。
前文中也提到,reduce函数的返回结果类型和传入的初始值相同,上个实例中初始值为number类型,同理,初始值也可为object类型。
var
items
=
[10,
120,
1000];
//
our
reducer
function
var
reducer
=
function
add(sumSoFar,
item)

sumSoFar.sum
=
sumSoFar.sum
+
item;
return
sumSoFar;
;
//
do
the
job
var
total
=
items.reduce(reducer,
sum:
0);
console.log(total);
//
sum:1130
多重叠加
使用reduce方法可以完成多维度的数据叠加。如上例中的初始值sum:
0
,这仅仅是一个维度的操作,如果涉及到了多个属性的叠加,如sum:
0,totalInEuros:
0,totalInYen:
0
,则需要相应的逻辑进行处理。
在下面的方法中,采用分而治之的方法,即将reduce函数第一个参数callback封装为一个数组,由数组中的每一个函数单独进行叠加并完成reduce操作。所有的一切通过一个manager函数来管理流程和传递初始参数。
var
manageReducers
=
function(reducers)

return
function(state,
item)

return
Object.keys(reducers).reduce(
function(nextState,
key)

reducers[key](state,
item);
return
state;
,

);

;
上面就是manager函数的实现,它需要reducers对象作为参数,并返回一个callback类型的函数,作为reduce的第一个参数。在该函数内部,则执行多维的叠加工作(
Object.keys()
)。
通过这种分治的思想,可以完成目标对象多个属性的同时叠加,完整代码如下:
var
reducers
=

totalInEuros
:
function(state,
item)

return
state.euros
+=
item.price
*
0.897424392;
,
totalInYen
:
function(state,
item)

return
state.yens
+=
item.price
*
113.852;

;
var
manageReducers
=
function(reducers)

return
function(state,
item)

return
Object.keys(reducers).reduce(
function(nextState,
key)

reducers[key](state,
item);
return
state;
,

);

;
var
bigTotalPriceReducer
=
manageReducers(reducers);
var
initialState
=
euros:0,
yens:
0;
var
items
=
[price:
10,
price:
120,
price:
1000];
var
totals
=
items.reduce(bigTotalPriceReducer,
initialState);
console.log(totals);
总结
以上就是javascript中内建函数reduce应用的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

python 内建函数 filter,map和reduce

     python 内建函数 filter,map和reduce, 三个函数比较类似,都是应用于序列的内置函数,常见的序列包括list、tuple、str等。而且三个函数都可以和lambda表达式结合使用。下面分别介绍。

1、filter

filter(bool_func,seq):此函数的功能类似过滤器。调用一个布尔函数bool_func来迭代遍历每个seq中的元素;返回一个使bool_seq返回值为true的元素的序列。

例如 : 从[1,2,3,4,5,6,7,8,9]序列中获取被3整除的序列

print filter(lambda x: x%3 == 0,[1,2,3,4,5,6,7,8,9])

结果为:[3, 6, 9]

2、map

map(func,seq1[,seq2...]):将函数func作用于给定序列的每个元素,并用一个列表来提供返回值;如果func为None,func表现为身份函数,返回一个含有每个序列中元素集合的n个元组的列表。

print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6])

结果:[4, 10, 18]

print map( lambda x, y: ( x * y, x - y), [4, 5, 6], [3, 2, 1] )

结果:[(12, 1), (10, 3), (6, 5)]

print map(lambda x : x * 3,[1,2,3,4,[3,2,1]]) 

结果:[3, 6, 9, 12, [3, 2, 1, 3, 2, 1, 3, 2, 1]]  因为[3,2,1]是子序列,乘以3所以结果包含三组[3,2,1]

 

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam‘, ‘LISA‘, ‘barT‘],输出:[‘Adam‘, ‘Lisa‘, ‘Bart‘]

input =[‘adam‘, ‘LISA‘, ‘barT‘]

print map(lambda x:x.capitalize(), input) # 这里调用了字符串内置函数capitalize(首字母大写,其余小写)

结果:[‘Adam‘, ‘Lisa‘, ‘Bart‘]  

 

3、reduce

reduce(func,seq[,init]):func为二元函数,将func作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列的元素),连续的将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值:如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列的头两个元素。

例如: 

print reduce(lambda x,y : x * y, [1,2,3,4,5,6])

结果:720

n=5
print reduce(lambda x,y: x * y,range(1,n)) #n的阶乘,

当n=5时,结果为:24

print reduce(lambda x,y: x * y,range(1,n),10) #n的阶乘的10倍

结果:240

以上是关于Javascript中内建函数reduce的应用详解的主要内容,如果未能解决你的问题,请参考以下文章

python中内建函数isinstance的用法

Go语言中内建函数new和make的区别

python 内建函数 filter,map和reduce

Python内建函数reduce()用法

js 内建函数reduce

JS的内建函数reduce