手写实现数组的方法
文章目录
- 手写实现数组的方法
- some
- every
- filter
- map
- reduce
- 总结
some
该方法用于检测数组中的元素是否满足指定条件 ,只要有一个满足就返回true,否则false.不会改变原数组。
let data=[1,2,3];
Array.prototype.mySome=function(fn){
if(typeof fn!='function'){
throw new TypeError('这不是一个函数')
}
for(let i=0;i<this.length;i++){
if(fn(this[i])){
return true
}
}
return false
}
let some = data.mySome(item => {
return item > 2
})
every
是对数组中每一项运行给定函数,如果该函数所有一项返回true,则返回true。一旦有一项不满足则返回flase,不会改变原数组。
let data=[1,2,3,4];
Array.prototype.myEvery = function(fn) {
if(typeof fn != 'function'){
throw new TypeError(`error ${fn} no a function `)
}
for (let i = 0; i < this.length; i++) {
if(!fn(this[i])){
return false
}
}
return true
}
let every = data.myEvery(item => {
return item > 2
})
filter
使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。返回新数组。不会改变原数组
Array.prototype.myFilter=function(fn){
if(typeof fn!='function'){
throw new TypeError(`this is ${fn} is not function`)
}
let newFilterData=[];
for(let i=0;i<this.length;i++){
if(fn(this[i])){
newFilterData.push(this[i])
}
}
return newFilterData;
}
let filter=data.myFilter(item=>{
return item>1
})
map
map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。返回新数组, 不会改变原数组
Array.prototype.myMap=function(fn){
if(typeof fn!='function'){
throw new TypeError(`this is ${fn} is not function`)
}
let newArray=[];
for(let i=0;i<this.length;i++){
if(fn(this[i])){
newArray.push(fn(this[i]))
}
}
return newArray;
}
let map=data.myMap(item=>{
return item+'map'
})
reduce
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。不会改变原数组
Array.prototype.myReduce=function(fn,obj){
if(typeof fn!='function'){
throw new TypeError(`this is ${fn} is not function`)
}
for(let i=0;i<this.length;i++){
obj=fn(obj,this[i])
}
return obj
}
let reduce=data.myReduce((pre,item)=>{
pre= pre+item
return pre
},0)
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let count=names.myReduce((pre,cur)=>{
if(cur in pre){
pre[cur]++
}else{
pre[cur]=1
}
return pre;
},{})
总结
-
相同点:都不会改变原数组
-
不同点:
map():有返回值,可以return出来
forEach():没有返回值
filter():返回一个符合func条件的元素数组(并没有改变原数组)
some():返回一个boolean,判断是否有元素是否符合func条件(有一个就行)
every():返回一个boolean,判断每个元素是否符合func条件(所有都判断)
