实用案例:
let arr = [1, 2, 3, 34, 67, 89, 23];
let newArr = arr.filter(x => x < 20).map(x => x * 2).reduce((prev, cur) => prev + cur);
console.log(newArr);//12
a.强大的reduce
arr.reduce(callback,[initialValue])
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素,item in arr)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
1.常用来求和/求积:
var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24
2. 数组去重
var arr = [1, 2, 3, 4];
var newArr = arr.reduce(function (prev, cur) {
prev.indexOf(cur) === -1 && prev.push(cur);
return prev;
},[]);
解析: initialValue为一个空数组,确定了pre和返回值类型为数组;
第一次: prev=[], cur=arr[0]=1;
第二次: prev=[1], cur=2;
3.数组扁平化
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
4.对象属性求和
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = result.reduce(function(prev, cur) {
return cur.score + prev;
}, 0);
console.log(sum) //60
b. map
/* map函数: 处理arr里的每一个item,并返回新数组 */
let arr = [1, 2, 3, 34, 67, 89, 23];
let newArr2 = arr.map(callback);
function callback(n) {
return n * 2;
}
console.log(newArr2); //(7) [2, 4, 6, 68, 134, 178, 46]
c. filter
let arr = [1, 2, 3, 34, 67, 89, 23];
/* filter回调函数要求:必须返回一个boolean值; true:把这次回调的n加入到新的数组中 */
let newArr1 = arr.filter(callback);
function callback(n) {
return n < 20; //将满足条件的数组元素添加到新数组里面
}
console.log(newArr1); //(3) [1, 2, 3]