高舉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>