处理数组的几种方式
1、reduce
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
语法:
arr.reduce(callback,[initialValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,
callback(执行数组中每个值的函数,包含四个参数)
1、previousValue(上一次调用回调返回的值,或者是提供的初始值)
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;
},0) //注意这里设置了初始值
console.log(arr, sum);
其中,给了初始值0,则调用时代码循环执行了四次
用法:
1)计算数组中每个元素出现的次数
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
},{})
console.log(nameNum)
2、数组循环(有返回 重组数组使用map,filter;无返回直接使用forEach)
- forEach,for循环:直接用于对数组的处理 无返回值时使用
- map 、filter 对现有数组进行重组返回一个新数组;
map 是否满足条件都会返回
filter 返回满足条件的某些数据项;
3、some 判断数组中某一项是否满足要求 返回true/false;
let attr2=[{name:'1',age:22},{name:'2',age:33}]
const isHasName1=attr2.some(item=>item.name==='1');
console.log(isHasName1)
4、find 返回满足条件的某一项,满足条件即直接跳出循环;没有任何一项满足返回undefined
let attr2=[{name:'1',age:22},{name:'2',age:33}]
const isHasName1=attr2.find(item=>item.name=='1')
console.log(isHasName1)
const isHasName5=attr2.find(item=>item.name=='5')
console.log(isHasName5)
5、push unshift 数组添加某一项;改变原数组值
6、pop shift 数组移除某一项; 改变原数组值
7、slice 截取数组;返回截取的结果 不改变原数组值
8、splice 截取/替换莫数组值 ,返回要处理的数据结果 改变原数组值
let attr3=[1,2,45]
attr3.push(66);
console.log(attr3); // [1, 2, 45, 66]
attr3.unshift(0);
console.log(attr3); // [0,1, 2, 45, 66]
attr3.pop()
console.log(attr3); // [0, 1, 2, 45]
attr.shift()
console.log(attr3); // [1, 2, 45]
let sliceAttr=attr3.slice(0,1);
console.log(sliceAttr) // [1]
console.log(attr3); // [1, 2, 45]
const spliceAttr=attr3.splice(1,1,'test');
console.log(spliceAttr) // [2]
console.log(attr3); //[1, 'test', 45]
const apliceAttr2=attr3.splice(1,2,...['change333','change4444'])
console.log(apliceAttr2) // [ 'test', 45]
console.log(attr3); //[1,'change333','change4444']