数组中every、some、from、reduce四个很重要的api用法总结
-
every
- 应用场景:数组的每一项是否都符合要求,都符合返回true,有一项不符合返回false
- [1,2,3,4,5,6,7].every(item=>item>1)//false
-
some
- 应用场景:数组的是否有某一项符合要求,只要寻址到有一项符合返回true,都不符合返回false
- [1,2,3,4,5,6,7].some(item=>item>1)//true
-
from
- 对拥有length属性的对象或可迭代的对象来返回一个数组
- Array.from(new Set([1,1,2,3])) //[1,2,3]
- Array.from([1,1,2,3],X=>X*10) //[10,10,20,30]
-
reduce【函数累计处理的结果】
- api:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
- callback
- accumulator
累计器累计回调的返回值
它是上一次调用回调时返回的累积值,或initialValue - currentValue
数组中正在处理的元素
- index 可选
数组中正在处理的当前元素的索引,如果提供了initialValue,则起始索引号为0,否则从索引1起始
- array可选
调用reduce()的数组
- accumulator
- initialValue可选
- 作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错
- 关于第一次执行:
- 回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。
- 提供初始值通常更安全
// reduce() 没有初始值 [ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( (a,b) => Math.max( a.x, b.x ) ); // NaN [ { x: 2 }, { x: 22 } ].reduce( (a,b) => Math.max( a.x, b.x ) ); // 22 [ { x: 2 } ].reduce( (a,b) => Math.max( a.x, b.x ) ); // { x: 2 } [ ].reduce( (a,b) => Math.max( a.x, b.x ) ); // TypeError
- 常见应用场景
- 求和,求乘积
var arr = [1, 2, 3, 4]; var sum = arr.reduce((x,y)=>x+y)//10 var mul = arr.reduce((x,y)=>x*y)//24
- 求对象里的属性求和
var result = [ { subject: 'math', score: 10 }, { subject: 'chinese', score: 20 }, { subject: 'english', score: 30 } ]; var sum = result.reduce((a, b)=> a + b.score, 0));//60
- 数组去重
let arr = [1,2,3,4,4,1] let newArr = arr.reduce((a,b)=>{ if(!a.includes(b)){ return a.concat(b) }else{ return b } },[])//[1,2,3,4]
- 拉平数组
let arr = [[0, 1], [2, 3], [4, 5]] let newArr = arr.reduce((a,b)=>{ return a.concat(b) },[])//[0,1,2,3,4,5]
- 拉平多维数组
let arr = [[0, 1], [2, 3], [4,[5,6,7]]] const newArr = function(arr){ return arr.reduce((a,b)=>a.concat(Array.isArray(b)?newArr(b):b),[]) } newArr(arr)//[0,1,2,3,4,5,6,7]
- 计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){ pre[cur]++ }else{ pre[cur] = 1 } return pre },{}) // {'Alice':2,'Bob':1,'Tiff':1,'Bruce':1}
- 常见应用场景
- api: