reduce的基本定义

个人理解: 根据数组reduce的定义来说:

1.从数组第一个元素开始遍历,逐渐遍历到最后一项

2.reduce 接受两个参数,一个回调函数,一个初始值,如果不给Reduce初始值他会默认从第一个元素开始。

3.reduce的回调函数接受四个参数

Accumulator(acc)累加器,

Curent Value(cur)当前值,

Current Index(idx) 当前索引,

Sourc Array(src)元素组。

其中必须要传两个参数。累加器 跟 当前值!!!

基本用法

计算数组里面所有值的和!

1.这个给了reduce两个参数,他回调函数中的方法,就是累加器 acc 加 current

2.他的默认值就是0,他的累加器就是0,然后从零开始相加(根据回调函数的方法)

3.Reduce遍历数组中每个元素,每遍历一个元素就会自动调用一次回调函数。

4.最后的结果就是:6

var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator   currentValue;
}, 0);

累加对象数组里的值!

1.如果不给这个数初始值,他就会数组中的一个元素当做累加器。

2.然后reduce开始遍历,并且调用回调函数,开始 x:1 2 3

//var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (accumulator, currentValue) {
    return accumulator   currentValue.x;
})
console.log(sum) 

在这里插入图片描述

3. 给他初始值0,最后的输出结果就没有问题

var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (accumulator, currentValue) {
    return accumulator   currentValue.x;
},initialValue)
console.log(sum) // logs 6

将二维数组转换为一维数组!

1.初始值默认值 设置为 一个空数组。

2.每次迭代 都让累计值.concat(当前元素) 最后将累加值return出来

var arr = [1,2,[3,4],[5]];
arr1 = arr.reduce((acc,cur)=> acc.concat(cur),[])
console.log(arr1)

计算数组中每个元素出现的次数

1.js in 关键字 用来判断一个属性是不是在一个对象或者在其原型链之中。

2.给初始值默认为一个空对象,然后开始迭代。

3.第一次遍历 Alice in { } 不存在返回 false 走else分支。

4.以此类推 直到第五次 Alice in{‘Alice’:1} 因为acc里面有了Alice 这个属性,他会返回true,acc[cur ] ;

5.最后输出结果

6.{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (acc, cur) {
  if (cur in acc) {
    acc[cur]  ;
  }
  else {
    acc[cur] = 1;
  }
  return acc;
}, {});
console.log(countedNames)

用Reduce按属性对object分类

思路

1.给初始值一个为一个空对象 然后根据空对象,然后判断 累加值 有没有这个属性有的话直接将 cur push 进去, 没有的话给他新增 并且赋值为空 [ ]。

2.将数组 跟 要分类的属性传入到函数中groupBy(people,age);

3.开始进行循环 第一轮循环 中,acc = { }, obj = { name:“Alice”, age:21},向下执行 新增一个变量用来保存 obj[age]中的值 key = 21;

4.继续向下执行 走到if这里 他判断的是,累加值中,有没有这个属性,没有的话 就给 属性 = 一 个空数组,累加器中如果有这个属性的话,就直接将 obj push进去。

在这里插入图片描述

var people = [
  { name: 'Alice', age: 21 },
  { name: 'Max', age: 20 },
  { name: 'Jane', age: 20 }
];
function groupBy(objectArray, property) {
  return objectArray.reduce(function (acc, obj) {
    var key = obj[property];
    if (!acc[key]) {
      acc[key] = [];
    }
    acc[key].push(obj);
    return acc;
  }, {});
}
var groupedPeople = groupBy(people, 'age');
// groupedPeople is:
// {
//   20: [
//     { name: 'Max', age: 20 },
//     { name: 'Jane', age: 20 }
//   ],
//   21: [{ name: 'Alice', age: 21 }]
// }

使用扩展运算符和initialValue绑定包含在对象数组中的数组!

1.原理

2.每次运行,每次用…打散数组。

var friends = [{
            name: 'Anna',
            books: ['Bible', 'Harry Potter'],
            age: 21
        }, {
            name: 'Bob',
            books: ['War and peace', 'Romeo and Juliet'],
            age: 26
        }, {
            name: 'Alice',
            books: ['The Lord of the Rings', 'The Shining'],
            age: 18
        }];
 var allbooks = friends.reduce(function(prev,cur){
            console.log("prev",...prev,"cur",...cur.books);
            return [...prev,...cur.books]
        },[])
        console.log(allbooks);

数组去重

1.原理每次循环,然后 在数组中查找当前值,如果当前值,indexOf返回的是-1 说明当前值没有 就push进去。

let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd'];
let arr = myArray.reduce((prev,cur)=>{
	if (prev.indexOf(cur) === -1){
		prev.push(cur)
	}
	return prev
},[]);
console.log(arr)

数组去重2

原理:这个只适用于 数组元素 是数值的内容。先用sort进行排序。

1.然后进行循环 init .length ===0 或者init[init.length -1] 不等于 cur,就将current,push进去。

2.排序完成之后 [1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 5, 5]

3.然后开始循环 第一次 init ===0 ,然后直接push进去, init =[1]

4.第二轮循环 init.length -1 =0 , init[0] ==1 所以不执行,继续循环

5.第三轮 init.length -1 =0 ,init[0] ! ==cur 所以把 2也push进去现在init =[1,2]

6.第四次 init.length -1 =1,init[1] ==2 所以不操作 ,以此类推,init = [1,2]

let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
    if(init.length === 0 || init[init.length-1] !== current) {
        init.push(current);
    }
    return init;
}, []);
console.log(result); //[1,2,3,4,5]

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注Devmax的更多内容! 

JavaScript reduce的基本用法详解的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  8. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  9. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  10. iOS应用程序的UI自动化测试如何与乐器和Javascript

    从WWDC2010视频会议中了解iOS应用程序的自动化UI测试,但没有实践.从代码项目project,我们可以有一个例子.这个问题在这里听到有涉及这个的人.任何限制?解决方法我建议从AlexWollmer开始使用thisblogpost.他创建了一个非常有用的JavaScript库:tuneup_jswithtest()函数,它允许测试分离和有用的帮助者以及为自动化仪器编写测试的断言.

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部