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 ...
随机推荐
- Java IO & Serialization
Java IO & Serialization 专为开卷考试准备,内容包括基本的文本文件和二进制文件的读写以及序列化反序列化操作 IO demo package helloworld; imp ...
- 域名到IP 报错socket.gaierror: [Errno 8] nodename nor servname provided, or not known
Python中如何通过域名,查看对应的IP? 请看如下代码: import socket hostname="www.baidu.com" ip = socket.gethostb ...
- LC 861. Score After Flipping Matrix
We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...
- WARNING: inbound connection timed out (ORA-3136)
WARNING: inbound connection timed out (ORA-3136) WARNING: inbound connection timed out (ORA-3136) Ta ...
- [ubuntu]android SDK 与Gradle环境的安装与配置|搭建android基础开发/构建环境
系统环境: linux:ubuntu18 已配置jdk 环境变量 切换到root账户 sudo su 安装Android-sdk (0)准备工作 切换到/usr/local目录: /usr/local ...
- 数据中心网络架构的问题与演进 — Overlay 网络
目录 文章目录 目录 前文列表 数据中心网络架构演进回顾 Overlay 网络 Overlay 网络的优势 基于 VxLAN Overlay 的 Spine-Leaf 网络架构 参考文章 前文列表 & ...
- Python 正则表达式【二】
关于前向,后向,匹配,非匹配 Matches if ... matches next, but doesn’t consume any of the string. This is called a ...
- 深入理解python中函数传递参数是值传递还是引用传递
深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...
- linux新建文件夹
mkdir -p .... -p ----parents no error if existion, make parent directories as needed
- DDoS攻击的几种类型
DDoS攻击的几种类型 随着网络攻击的简单化,如今DDoS攻击已经不止出现在大型网站中,就连很多中小型网站甚至是个人网站往往都可能面临着被DDoS攻击的的风险.或许很多站长对DDoS攻击并不是很了 ...