Array.reduce()方法
// 简单数组各项求和
const arr = [0, 1, 2, 3, 4]
const sum = arr.reduce(function(accumulator, currentValue, currentIndex, array){
console.log(accumulator, currentValue, currentIndex, array)
return accumulator + currentValue
}, 0)
// 执行顺序
// 0 0 0 (5) [0, 1, 2, 3, 4]
// 0 1 1 (5) [0, 1, 2, 3, 4]
// 1 2 2 (5) [0, 1, 2, 3, 4]
// 3 3 3 (5) [0, 1, 2, 3, 4]
// 6 4 4 (5) [0, 1, 2, 3, 4]
console.log(sum) //
// accumulator会把上一次循环返回的结果存起来,带到下一次循环中,使用reduce方法可以很容易的计算数组累加,累乘 // 对象数组求和
const arr = [{
count: 10,
weight: 1,
height: 2
}, {
count: 20,
weight: 2,
height: 4
}, {
count: 30,
weight: 3,
height: 6
}, {
count: 40,
weight: 4,
height: 8
}] // 合计count
const obj = arr.reduce((acc, cur) => {
return acc + cur.count
}, 0)
console.log(obj) // // 合计count,weight,height
const obj2 = arr.reduce((acc, cur) => {
for (let key in cur) {
if (!acc[key]) {
acc[key] = 0
}
acc[key] += cur[key]
}
return acc
}, {})
console.log(obj2) // {count: 100, weight: 10, height: 20}
// 普通数组统计
let arr = ['李明', '韩梅梅', '张三', '李明', '李明', '张三', '韩梅梅', '李明', 'Jack', '韩梅梅']
const sum = arr.reduce((acc, cur) => {
if (!acc[cur]) {
acc[cur] = 0
}
acc[cur]++
return acc
}, {})
console.log(sum) // {李明: 4, 韩梅梅: 3, 张三: 2, Jack: 1} // 对象数组统计
let arr1 = [{
hobby: 'basketball'
}, {
hobby: 'badminton'
}, {
hobby: 'basketball'
}, {
hobby: 'swim'
}, {
hobby: 'basketball'
}, {
hobby: 'swim'
}, {
hobby: 'pingpong'
}]
const sum2 = arr1.reduce((acc, cur) => {
if (!acc[cur.hobby]) {
acc[cur.hobby] = 0
}
acc[cur.hobby]++
return acc
}, {})
console.log(sum2) // {basketball: 3, badminton: 1, swim: 2, pingpong: 1}
// 上面已经获取了每个元素的次数,现在要拿到最大次数的key值
let arr = ['李明', '韩梅梅', '张三', '李明', '李明', '张三', '韩梅梅', '李明', 'Jack', '韩梅梅']
const sum = arr.reduce((acc, cur) => {
if (!acc[cur]) {
acc[cur] = 0
}
acc[cur]++
return acc
}, {})
console.log(sum) // {李明: 4, 韩梅梅: 3, 张三: 2, Jack: 1} let max = {
count: 0,
key: ''
}
for (let key in sum) {
if (max.count < sum[key]) {
max.count = sum[key]
max.key = key
}
}
console.log(max) // {count: 4, key: "李明"}
let arr = [[1, 2], 3, 4, [5, 6, 7], 8, [9]]
let newArr = arr.reduce((acc, cur) => {
return acc.concat(cur)
}, [])
console.log(newArr) // (9) [1, 2, 3, 4, 5, 6, 7, 8, 9]
// 普通数组去重
let arr = [1, 3, 3, 2, 4, 4, 5, 3, 2, 5, 6]
let newArr = arr.reduce((acc, cur) => {
if (!acc.includes(cur)) {
acc.push(cur)
}
return acc
}, [])
console.log(newArr) // (6) [1, 3, 2, 4, 5, 6] // 对象数组去重, 对象数组去重需指定以哪个对象属性来去重
let arr1 = [{
name: '李明',
age: 18
}, {
name: '韩梅梅',
age: 18
}, {
name: '韩梅梅',
age: 20
}, {
name: '李明',
age: 20
}, {
name: 'jack',
age: 22
}, {
name: '张三',
age: 22
}]
function doRepeat (arr, key) {
let obj = {}
let newArr1 = arr.reduce((acc, cur) => {
if (!obj[cur[key]]) {
obj[cur[key]] = cur[key]
acc.push(cur)
}
return acc
}, [])
return newArr1
}
// 姓名去重
console.log(doRepeat(arr1, 'name'))
// 0: {name: "李明", age: 18}
// 1: {name: "韩梅梅", age: 18}
// 2: {name: "jack", age: 22}
// 3: {name: "张三", age: 22} // age去重
console.log(doRepeat(arr1, 'age'))
// 0: {name: "李明", age: 18}
// 1: {name: "韩梅梅", age: 20}
// 2: {name: "jack", age: 22}
实现笛卡尔积(商品sku计算)
// 测试的数据
let arrs = [['红','黄', '蓝'], ['大', '中', '小'], ['软', '硬']] /**
* 思路: 以第一项为基础,循环合并之后的每一项再循环的值
* @param {*} acc 累计的值
* @param {*} cur 当前遍历项
* @param {*} index 当前遍历索引
*/
let result = arrs.reduce((acc, cur, index) => {
// 从第二项开始合并值
if (index > 0) {
let saveArr = []
acc.forEach(item => {
cur.forEach(subItem => {
saveArr.push(`${item},${subItem}`)
})
})
acc = saveArr
}
return acc
}, arrs[0]) // 把数组的第一项传入作为初始值
console.log(result) // ["红,大,软", "红,大,硬", "红,中,软", "红,中,硬", "红,小,软", "红,小,硬", "黄,大,软", "黄,大,硬", "黄,中,软", "黄,中,硬", "黄,小,软", "黄,小,硬",
"蓝,大,软", "蓝,大,硬", "蓝,中,软", "蓝,中,硬", "蓝,小,软", "蓝,小,硬"]0: "红,大,软"1: "红,大,硬"2: "红,中,软"3: "红,中,硬"4: "红,小,软"5: "红,小,硬"6:
"黄,大,软"7: "黄,大,硬"8: "黄,中,软"9: "黄,中,硬"10: "黄,小,软"11: "黄,小,硬"12: "蓝,大,软"13: "蓝,大,硬"14: "蓝,中,软"15: "蓝,中,硬"16: "蓝,小,软"17: "蓝,小,硬", length: 18__proto__: Array(0)
Array.reduce()方法的更多相关文章
- Array.reduce()方法的使用
起因是学习异步函数的串行与并行写法时,发现reduce方法可以简化写法,然后看到一篇博客里面这样一段代码: var array = [1, [2, [3, 4], 5], 6]; function f ...
- 用es6的Array.reduce()方法计算一个字符串中每个字符出现的次数
有一道经典的字符串处理的问题,统计一个字符串中每个字符出现的次数. 用es6的Array.reduce()函数配合“...”扩展符号可以更方便的处理该问题. s='abananbaacnncn' [. ...
- Array.reduce()学习
昨天遇到的一道题:1234567890 => 1,234,567,890 要求其实就是使用逗号做千分位将数字进行分隔. 当时没想到任何方法,但是以前看到过,印象很深刻,今天就找了一下. 看到其实 ...
- JS Array.reduce 对象属性累加
Array reduce() 方法 ,无非就是 计算数组元素 相加后的总和 ,看网上给的Demo 全是 [1,2,3,4,6].reduce 这种基本用法, 本次我将使用 reduce 实现 数组 ...
- 自从学会了 Array.reduce() ,再也离不开它
(转载)原文链接:https://juejin.im/post/5dfd9d27e51d455825129ec3 在所有后 ES6 时代的数组方法中,我觉得最难理解的就是Array.reduce( ...
- JavaScript - reduce方法,reduceRight方法 (Array)
JavaScript - reduce方法 (Array) 解释:reduce() 方法接收一个函数作为累加器(accumulator),数组 中的每个值(从左到右)开始合并,最终为一个值. 语法:a ...
- reduce 方法 (Array) (JavaScript)
对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供. 语法 array1.reduce(callbackfn[, in ...
- 数组的方法之(Array.prototype.reduce() 方法)
reduce函数 reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值. 对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次 ...
- JavaScript Array every()&some()&reduce()方法
every()方法测试数组的所有元素是否都通过了指定函数的测试. // 每一项都要满足条件才会返回true,只要有一项不满足返回false var arr = [1, 2, 3, 4]; let bl ...
随机推荐
- html添加注释怎么弄?
HTML 注释: <!--这是一段注释.注释不会在浏览器中显示.--> 这是一段普通的段落. 快捷键: 我用的是 Notpad++ 添加行注释 Ctrl+K 取消行注释 Ctrl+Shif ...
- IIS asp.net 中出现未能加载文件或程序集“System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。
分析器错误消息: 未能加载文件或程序集“System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或 ...
- asp.net core mvc View Component 应用
ViewComponent 1.View 组件介绍 在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大,View组件不能使用model bindin ...
- JMeter自带工具录制配置方法
打开Jmeter,看到左边显示一个空的测试计划,把该测试计划改名为TestPlan1.右键单击该测试计划,选择“添加”-“线程组”,添加一个线程组,改名为TestGroup1.为了录制浏览器的操作,需 ...
- Idea Debug多线程不进断点问题处理
Idea也会使我狼狈不堪,Eclipse下约定成俗,却非Idea的默认规则. 比如 DEBUG多个线程时,Idea的默认设定就会遇到断点不能进入的问题. 解决的方法: 点击DEBUF框下的双红点(Vi ...
- 通过TCODE查找SPRO路径
1.SE11:CUS_ACTOBJ,根据OBJECTNAME(对象名称),即视图名称,获取Customizing activity(ACT_ID) 2.根据ACT_ID在表CUS_IMGACT获取说明 ...
- python解压压缩包
默认解压到当前目录 import shutil shutil.unpack_archive('/root/redis-3.2.3.tar.gz') 解压到home目录下 import shutil s ...
- python基础知识(保留字和标识符、变量、常量、基本数据类型)
保留字 保留字是python语言中已经被赋予特定意义的一些单词,开发程序时,不可以作为变量.函数.类.模块和其他对象的名称来使用例如:import 关键字输入后会变色 通过代码进行查看 import ...
- Nginx实现负载均衡的方式有哪几种呢?
什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...
- 云计算共享组件--Memcache缓存系统(4)
一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...