JS内置对象Array之reduce()用法

一、语法

arr.reduce(function(prev,cur,index,arr){
...
}, init);

其中,
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。

看上去是不是感觉很复杂?没关系,只是看起来而已,其实常用的参数只有两个:prevcur。接下来我们跟着实例来看看具体用法吧~

二、实例

先提供一个原始数组:

var arr = [3,9,4,3,6,0,9];
实现以下需求的方式有很多,其中就包含使用reduce()的求解方式,也算是实现起来比较简洁的一种吧。

1. 求数组项之和

var sum = arr.reduce(function (prev, cur) {
    return prev + cur;
},0);

由于传入了初始值0,所以开始时prev的值为0,cur的值为数组第一项3,相加之后返回值为3作为下一轮回调的prev值,然后再继续与下一个数组项相加,以此类推,直至完成所有数组项的和并返回。

2. 求数组项最大值

var max = arr.reduce(function (prev, cur) {
    return Math.max(prev,cur);
});


由于未传入初始值,所以开始时prev的值为数组第一项3,cur的值为数组第二项9,取两值最大值后继续进入下一轮回调。

或者使用如下方法求数组中的最大值:

var a=[1,2,3,5];
alert(Math.max.apply(null, a));//最大值
alert(Math.min.apply(null, a));//最小值

alert(Math.max.apply(Math, a));//最大值
alert(Math.min.apply(Math, a));//最小值

多维数组可以这么修改:

var a=[1,2,3,[5,6],[1,4,8]];
var ta=a.join(",").split(",");//转化为一维数组
alert(Math.max.apply(null,ta));//最大值
alert(Math.min.apply(null,ta));//最小值

3. 数组去重

var newArr = arr.reduce(function (prev, cur) {
    prev.indexOf(cur) === -1 && prev.push(cur);
    return prev;
},[]);

实现的基本原理如下:

① 初始化一个空数组
② 将需要去重处理的数组中的第1项在初始化数组中查找,如果找不到(空数组中肯定找不到),就将该项添加到初始化数组
③ 将需要去重处理的数组中的第2项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组
④ ……
⑤ 将需要去重处理的数组中的第n项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组
⑥ 将这个初始化数组返回

三、其他相关方法

1. reduceRight()

该方法用法与reduce()其实是相同的,只是遍历的顺序相反,它是从数组的最后一项开始,向前遍历到第一项。

重点总结:

reduce() 是数组的归并方法,与forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这一点是其他迭代方法无法企及的

参考博客:https://www.jianshu.com/p/541b84c9df90

原文地址:https://www.cnblogs.com/nayek/p/11789713.html

时间: 2024-10-08 11:09:20

JS内置对象Array之reduce()用法的相关文章

JS内置对象-Array之splice-删插替

splice-删除 1 var arr = [1, 2, 3, 4, 5, 6]; 2 //删除 3 var delArr = arr.splice(1, 2) 4 console.log(arr); // => (4) [1, 4, 5, 6] 5 console.log(delArr); // => (2) [2, 3] splice-插入 1 var arr = [1, 2, 3, 4, 5, 6]; 2 //插入 3 var insertArr = arr.splice(1, 0, &

JS内置对象-String对象、Date日期对象、Array数组对象、Math对象

一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义对象,然后创建新的对象实例 二.JS内置对象-String 1.string对象 string对象用于处理已有的字符串 字符串可以使用单引号或者双引号 2.indexOf( )  在字符串中查找字符串,如果匹配成功返回首字母所在的位置,否则返回-1 3.match() 匹配成功,返回匹配成功的数组,

5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、

location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID值获取一个DOM对象 getElementsByName(); 根据name属性值获取多个Dom对象 getElementsByTagName(); 根据标签获取多个DOM对象 获取标签体内容 innerHTML 获取input的value值 value 获取下拉框选中的值 value this 代

JS 内置对象 String对象

JS内置对象   String对象:字符串对象,提供了对字符串进行操作的属性和方法.   Array对象:数组对象,提供了数组操作方面的属性和方法.   Date对象:日期时间对象,可以获取系统的日期时间信息.   Boolean对象:布尔对象,一个布尔变量就是一个布尔对象.(没有可用的属性和方法)   Number对象:数值对象.一个数值变量就是一个数值对象.   Math对象:数学对象,提供了数学运算方面的属性和方法. String对象的属性和方法   length:获取字符串的长度.如:v

JS内置对象的原型不能重定义?只能动态添加属性或方法?

昨天马上就快下班了,坐在我对面的同事突然问我一个问题,我说“爱过”,哈哈,开个玩笑.情况是这样的,他发现JS的内置对象的原型好像不能通过字面量对象的形式进行覆盖, 只能动态的为内置对象的原型添加属性或方法,下面那个具体的例子说明: var arr=[]; Array.prototype={ push:function(){ alert("1"); } }; arr.push(); //没有任何输出 有人可能会说了“你先定义的arr,后来又修改了Array.prototype,这时Arr

4月8日--课堂笔记--JS内置对象

JavaScript Day8 一.    JS内置对象 字符串String a) 属性length:字符数量,不管是ASCII还是Unicode,都算1个字符 b) 查询方法: i.           charAt:根据索引位置查找字符,可以用[索引]代替(除了旧版IE) ii.           charCodeAt:根据索引位置查找字符编码 iii.           indexOf:根据字符(串)查找首次出现位置,如果找不到则返回-1:不指定第二个起始位置时从头开始查找,如果指定则

内置对象Array的原型对象中添加方法

// //倒序字符串的方法String.prototype.myReverse=function () { for(var i=this.length-1;i>=0;i--){ console.log(this[i]); }};var str="1234567";str.myReverse(); //为内置对象Array的原型对象中添加方法Array.prototype.mySort=function () { for(var i=0;i<this.length-1;i++

js内置对象总结

在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质. 注意:通过字面量创建的对象在调用属性和方法时会被对象包装器暂时包装成一个对象,具有对象的性质.如 var str="我不是一个真的对象"; alert(str.length);     //str被暂时包装成一个String对象,可调用该对象的属性和方法 不过这并不意味着它就是一个对象了,typeof(i)的值为仍Strin

2017-5-22 内置对象2和RepeaterCommand用法

(一)内置对象 1.Application 储存在服务端,占用服务器内存,生命周期永久 所有人访问的都是一个对象 用法:页面之间额传值 protected void Page_Load(object sender, EventArgs e) { Button1.Click += Button1_Click; } void Button1_Click(object sender, EventArgs e) { Application["aa"] = TextBox1.Text; Resp