高举reduce大旗,优秀
1、语法
arr.reduce(callback,[initialValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
<script>
// var arr = [1,2,3,4];
var arr = [];
var sum = arr.reduce(function(prev,cur,index,arr){
console.log(prev,cur,index);
return prev+cur;
},0)//initialValue初始值,如果数组为空的话,在没有初始值的情况下,会报错。提供初始值会更安全。
console.log(arr,sum);
//求和,求积
var arr1 = [1,2,4,4,5];
var sum1= arr1.reduce((x,y)=>x+y);
var mul = arr1.reduce((x,y)=>x*y);
console.log(sum1);
console.log(mul);
//计算数组中每个元素出现的次数
var arr2 = ["a","b","c","b","a","a"];
let ascnum = arr2.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++;
}else{
pre[cur] = 1;
}
return pre;
},{})
console.log(ascnum);
//数组去重
let arr3 = [3,5,5,3,2,2,3,5,2];
let newarr = arr3.reduce((pre,cur)=>{
if(!pre.includes(cur)){//includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。
return pre.concat(cur);//concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
}else{
return pre;
}
},[])
console.log(newarr);
//二维数组转化为一维
let arr4 = [[1,3],[3,5],[3,6]];
const newarr1 = arr4.reduce((pre,cur)=>{
return pre.concat(cur);
},[])
console.log(newarr1);
//将多维数组转化为一维
let arr5 = [[1,3,4],[3,4,[5,6,7]]];
const newarr2 = function(arr5){
return arr5.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newarr2(cur):cur),[]);
}
console.log(newarr2(arr5));
//对象里的属性求和
var result = [
{
name:"zhangsan",
age:7
},
{
name:"lisi",
age:9
},
{
name:"wangwu",
age:20
}
];
var sum = result.reduce((prev,cur)=>{
return cur.age + prev;
},0);
console.log(sum)
</script>