对象里的属性求和
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
将二维数组转化为一维
// let arr1 = arr.reduce((prev,cur)=>prev.concat(cur),[])//二维数组转换成一维数组
// console.log(arr1)
将多维数组转化为一维
let arr2 = [[1,2],[6,23],[2,[7,34,25]]]
let format = function(arr){
return arr.reduce((prev,cur)=>prev.concat(Array.isArray(cur)?format(cur):cur),[])
}
console.log(format(arr2))
数组降维还可以用flat()
[1, 2, [3,[4,6]]].flat(Infinity)
数组去重
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
console.log(newArr);// [1, 2, 3, 4]
与2019年11.20发现的的新方法
function flatten(arr){
while(arr.some((item)=>Array.isArray(item))){
arr = [].concat(...arr)
}
return arr
}
计算数组中每个元素出现的次数
let names = ['lili', 'B', 'T', 'Br', 'lili'];
let nameNum = names.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++
}else{
pre[cur] = 1
}
return pre
},{})
console.log(nameNum); //{lili: 2, B: 1, T: 1, Br: 1}
arr.reduce(callback,[initialValue])
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
打印结果:
1 2 1
3 3 2
6 4 3
[1, 2, 3, 4] 10