- **基础用法,接受两个参数,Array.reduce(function(prev, cur, inde, arr){},initialValue) **
可以通过初始值传入适当的值,来得到自己想要的结果(比较巧)
直接煮栗子_
- 数字数组求和
var arr = [1,2,3,4,5]
var sum = arr.reduce((prev, cur, index, arr) => {
console.log(prev, cur)
return prev + cur
})
console.log(sum(arr))
var arr = [1, 2, 3, 4, 5];
sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index, arr);
return prev + cur;
})
console.log(arr, sum);
传入初始值为0也是可以的
当不传入初始值的时候,初始prev 为数组第一项,从第二项开始循环,做length - 1次循环。
- 对象项求特定值
var result = [
{
subject: 'math',
score: 88
},
{
subject: 'chinese',
score: 95
},
{
subject: 'english',
score: 80
}
];
var sum = result.reduce((prev, cur, index, arr) => {
console.log(prev, cur, index)
return cur.score + prev
}, 0)
console.log(sum)
运行结果:
0 { subject: 'math', score: 88 } 0
88 { subject: 'chinese', score: 95 } 1
183 { subject: 'english', score: 80 } 2
263
总结: 传入初始值0,每次返回一个数字(cur.score + prev),在下次循环的时候传入prev,共进行length次操作。
- 变更复杂一些,加入分数的权重
var result = [
{
subject: 'math',
score: 88
},
{
subject: 'chinese',
score: 95
},
{
subject: 'english',
score: 80
}
];
var dis = {math: 0.5, chinese: 0.3, english: 0.2}
var sum = result.reduce((prev, cur, index, arr) => {
console.log(prev, cur, index)
return cur.score * dis[cur.subject] + prev
}, 0)
console.log(sum)
运行结果:
0 { subject: 'math', score: 88 } 0
44 { subject: 'chinese', score: 95 } 1
72.5 { subject: 'english', score: 80 } 2
88.5
- 面试题: 如何知道一串字符串中每个字母出现的次数?
function getStringTime(arr) {
return arr.split('').reduce((res, cur) => {
res[cur] ? res[cur] ++ : res[cur] = 1
return res
},{})
}
- 数组项加一
var arr = [1,2,3].reduce((res, cur) => {
res.push(cur + 1);
return res
},[])
console.log(arr)
运行结果: [2,3,4]
- 数组对象去重
var persons = [
{
name: 'Sam',
id: 1,
age: 23
},{
name: 'Nick',
id: 2,
age: 25
}, {
name: 'Kitty',
id: 1,
age: 30
}
]
var newArr = persons.reduce((res, cur) => {
res[cur.id] ? '' : res.push(cur)
return res
},[])
console.log(newArr)