js使用reduce实现map

先介绍一下 reduce 方法

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

参数:

  • 1.callback:回调函数,有四个参数

  • (1) accumulator:累计器,累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。

    (2) currentValue:当前值

    (3) index:可选,当前项的索引号,如果指定了 initialValue,则从 0 开始,否则从 1 开始

    (4) array:可选,调用reduce()的数组

  • 2.initialValue:可选,作为第一次调用callback 函数时的accumulator 的值,如果没有提供此参数,则数组的第一个元素作为 第一次调用callback 函数时的accumulator 的值

使用 reduce 简易的实现一个 map

// reduce 实现map
Array.prototype.__map = function (fn, thisArg) {
  return this.reduce((acc, cur, index,array) => {
    acc[index] = fn.call(thisArg, cur,index,array)
    return acc
  }, [])
}
results = crr.__map((item, index, array) => {
  return item +index
})
console.log('results-__map',results)

同上,使用forEach

Array.prototype._map = function (fn, thisArg) {
  const arr = []
  this.forEach((item,index, array) => {
    arr[index] = fn.call(thisArg, item,index,array)
  })
  return arr
}
const crr = [1,2,3,4,5]
results = crr._map((item, index,array) => {
  return item + index
})
console.log('results-_map',results)

使用 reduce 实现数组求和

const arr = [1,2,3,4,5,6]
const reducer = (previousValue, currentValue) => previousValue + currentValue;
const res = arr.reduce(reducer)
console.log('res',res)

将二维数组改成一维数组

const twoArr = [[1,2],[3,4],[5,6]]
const oneArr = twoArr.reduce((acc,cur) => {
  return [...acc,...cur]
})
console.log('oneArr',oneArr)

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

const testArr = [1,4,2,2,1,5,5,7,1]
const o = testArr.reduce((acc,cur) => {
  if (acc[cur]) {
    acc[cur] += 1
  } else {
    acc[cur] = 1
  }
  return acc
}, {})
console.log('o',o)

按属性对object分类

const people = [
  {name: '1', age: 10},
  {name: '2', age: 10},
  {name: '3', age: 12},
  {name: '4', age: 12},
  {name: '5', age: 16},
  {name: '6', age: 12},
]

const o1 = people.reduce((acc, cur) => {
  if (acc[cur.age]) {
    acc[cur.age].push(cur)
  } else {
    acc[cur.age] = [cur]
  }
  return acc
}, {})
console.log('o1',o1)

版权声明:本文为m0_46430338原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_46430338/article/details/120750598