reduce函数

reduce 的定义

reduce()方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值,简单来说就是对一个 array 执行 reduce()方法,就是把其中的 function()挨个地作用于 array 中的元素上,而且上一次的输出会作为下一次的一个输入

array.reduce(function(accumulator, currentValue, currentIndex, arr), initialValue);
/*
  accumulator:  必需。累计器
  currentValue: 必需。当前元素

  currentIndex: 可选。当前元素的索引;
  arr:          可选。要处理的数组
  initialValue: 可选。传递给函数的初始值,相当于accumulator的初始值
*/

常见用法

  • 求加法(乘法同理)
let arr = [1, 2, 3, 4, 5]
arr.reduce((sum, curr) => sum + curr, 0) // 得到15
  • 求最大值(最小值同理)
let arr = [1, 2, 3, 4]
let max = arr.reduce((pre, cur, index, arr) => {
  return pre > cur ? pre : cur
}) // 得到 4
  • 字符统计/单词统计同理
let str = 'abcdaabc';
​
str.split('').reduce((res, cur) => {
    res[cur] ? res[cur] ++ : res[cur] = 1 // 如果cur第一次出现,记为1
    return res;                           // 否则记录数+1
}, {})
  • 数组去重
let arr = [1, 2, 3, 4, 4, 1]
let newArr = arr.reduce((pre, cur) => {
  if (!pre.includes(cur)) {
    return pre.concat(cur)
  } else {
    return pre
  }
}, []) 
console.log(newArr)   //[1, 2, 3, 4]
  • 数组扁平化
let arr = [[0, 1],[2, 3],[4, 5]] // 二维数组

let newArr = arr.reduce((pre, cur) => {
  return pre.concat(cur) // 合并pre 与 cur, 并返回一个新数组
}, [])
console.log(newArr) // 一维数组 [0, 1, 2, 3, 4, 5]

//or

newArr = arr.flat()
console.log(newArr) // 一维数组 [0, 1, 2, 3, 4, 5]
  • 按属性分组
let obj = [
  { name: '张三', job: '数据分析师', country: '中国' },
  { name: '艾斯', job: '科学家', country: '中国' },
  { name: '雷尔', job: '科学家', country: '美国' },
  { name: '鲍勃', job: '软件工程师', country: '印度' },
]

cosnt newObj = obj.reduce((pre, cur) => {
  let newkey = cur['country']
  if (!pre[newkey]) {
    pre[newkey] = []
  }
  pre[newkey].push(cur)
  return pre
}  [])

console.log(newObj)   // [中国: [{…}, {…}],印度: [{…}],美国: [{…}]]
  • 翻转字符串
const str = [...'hello world'].reduce((a, v) => v + a)
console.log(str)  //dlorw olleh
//or

const str = [..."hello world"].reverse().join('')
console.log(str) dlorw olleh
  • 处理不规则数组
let data = [
  ['红色', '128g', '苹果手机'],
  ['南北', '两室一厅', '128㎡', '洋房住宅'],
  ['小米', '白色', '智能运动手表', '心率血压血氧', '来电信息提醒'],
  ['官方发售', '2020年秋季', '篮球', '球鞋', '品牌直邮'],
]
let dataConcat = data.map((item) => item.reduce((a, i) => `${a} ${i}`))
console.log(dataConcat) // ["红色128g苹果手机","南北两室一厅128㎡ 洋房住宅","小米白色智能运动手表 心率血压血氧 电信息提醒","官方发售2020年秋季篮球球鞋品牌直邮"]

你可能感兴趣的:(javascript,javascript,开发语言,ecmascript)