1、forEach:遍历数组
let data = [1,2,3,4,5,6,7]
//用法
data.forEach(function(res,index,arr){
// forEach 的 this 指向forEach 的第二个参数 {name: "aaaaaa"},没有第二个参数的话,this指向window
console.log(this)
// console.log(res,index,arr)
},{name: "aaaaaa"})
//重写
Array.prototype.myForEach = function(fn) {
//数组调用,this指向数组本身,通过this获取数组
let arr = this
let len = arr.length
//forEach方法有两个参数,第一个参数是函数,第二个参数是myForEach方法的this指向,没有第二个参数的话,this指向window
//例如:myForEach 的 this 指向 {name: "aaaaaa"}
let arg1 = arguments[1] || window
for(let i = 0;i<len;i++){
fn.apply(arg1,[arr[i],i,arr])
}
}
var fn = function (elem,index,arr){
console.log(this)
}
data.myForEach(fn,{name: "aaaaaa"})
2、filter:过滤 用来筛选符合条件的元素。
let data = [1,2,3,4,5,3,4,3]
// 用法
let newArr = data.filter(function(elem,index,arr) {
console.log(this)
return elem == 4
},{name: "aaaaaa"})
console.log(newArr)
//重写
Array.prototype.myFilter = function(fn){
let arr = this;
let len = arr.length;
let arg1 = arguments[1] || window
let newArr = [] //注意这里push进来的是应用类型的下标
for(let i = 0;i<len;i++){
fn.apply(arg1,[arr[i],i,arr])?newArr.push(temp):""
}
return newArr
}
var fn = function(elem,index,arr){
return elem == 3
}
let newArr = data.myFilter(fn)
console.log(newArr)
3、map 映射
{ name: "aaaaaa", price: 23 },
{ name: "aaaaaa", price: 23 },
{ name: "aaaaaa", price: 23 },
]
var tempBook = book.map(function(elem,index,arr){
elem.name = "123"+elem.name //map里面修改了数组里面的数据,原数组也会产生影响
return elem
})
Array.prototype.myMap = function(fn){
let arr = this;
let len = arr.length;
let arg1 = arguments[1] || window
let newArr = []
let temp;
for(let i = 0;i<len;i++){
temp = deepClone(arr[i])//防止改变原数组
newArr.push(fn.apply(arg1,[temp,i,arr]))
}
return newArr
}
function fn(elem,index,arr){
elem.name = "123"+elem.name
return elem
}
var tempBook = book.myMap(fn)
// 深拷贝======for...in循环对象的所有枚举属性,然后再使用hasOwnProperty()方法来忽略继承属性。
function deepClone(data){
const tempData = data.constructor === Array ? []:{}// 第一步复制的目标是数组还是对象
for(let keys in data){ // 遍历目标
// console.log('aaaa')
if(data.hasOwnProperty(keys)){ //Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。
// console.log('bbbbbbb')
if(data[keys] && typeof data[keys] === "object"){
tempData[keys] = data[keys].constructor === Array ? []:{}
tempData[keys] = deepClone(data[keys])
}else{
tempData[keys] = data[keys]
}
}
}
return tempData
}
4、every : 有一个条件(不满足)就停止遍历 some : 有一个条件(满足)就停止遍历
// every() some()
var people = [
{ name: 'aaa', age: 11 },
{ name: 'aaa', age: 12 },
{ name: 'aaa', age: 13 },
]
//用法
//如果有一个条件(不满足)就停止遍历,return后面的表达式就是条件
var res = people.every(function(elem,index,arr){
console.log(elem.age)
return elem.age == 13
})
//重写
//如果有一个条件(满足)就停止遍历,return后面的表达式就是条件
var res = people.some(function(elem,index,arr){
console.log(elem.age)
return elem.age == 12
})
Array.prototype.myEvery = function(fn){
let arr = this;
let len = arr.length;
let arg1 = arguments[1]
let res = true
for(let i = 0 ; i < len ; i++){
res = fn.apply(arg1,[arr[i],i,arr])
if(!res){
break
}
}
return res
}
function fn(elem,index,arr){
return elem.age == 13
}
console.log(people.myEvery(fn))
5、reduce() 归纳函数
let sum = [1,2,3,4,5,6,7,8,9]
//用法
let total = sum.reduce((total,item) => {
return total+item
})
console.log(total); // 45
//重写
Array.prototype.myReduce = function(fn,initalValue){
var arr = this;
var len = arr.length;
var arg2 = arguments[2] || window
for(let i = 0; i < len; i++){
initalValue = fn.apply(arg2,[initalValue,arr[i],arr])
}
return initalValue
}
function fn(init,elm,index,arr){
return init + elm
}
console.log(sum.myReduce(fn,0))
网友评论