let arr1 = [0, 1, 2, 3, 4].reduce(function (accumulator, currentValue, currentIndex, array) {
// accumulator 累计器
// currentValue 当前值
// currentIndex 当前索引
// array 数组
return accumulator + currentValue
})
// 等价于
let arr2 = [0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr)
console.log(arr2)
// 提供一个初始值作为reduce()方法的第二个参数
let arr3 = [0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => {
return accumulator + currentValue
}, 10)
console.log(arr3)
// 要累加对象数组中包含的值,必须提供初始值,以便各个item正确通过你的函数
let initialValue = 0
let sum = [{x: 1}, {x: 2}, {x: 3}].reduce(function (accumulator, currentValue) {
return accumulator + currentValue.x
}, initialValue)
console.log(sum) // 6
// 将二维数组转化为一维
let flattened = [[0, 1], [2, 3], [4, 5]].reduce(
function (a, b) {
return a.concat(b)
},
[]
)
console.log(flattened)// [0, 1, 2, 3, 4, 5]
// 计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
let countedNames = names.reduce(function (allNames, name) {
if (name in allNames) {
allNames[name]++
} else {
allNames[name] = 1
}
return allNames
}, {})
console.log(countedNames)
// 按属性对object分类
let 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
}, {})
}
let groupedPeople = groupBy(people, 'age')
console.log(groupedPeople)
// 数组去重
let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
let myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
if (accumulator.indexOf(currentValue) === -1) {
accumulator.push(currentValue)
}
return accumulator
}, [])
console.log(myOrderedArray)