1. forEach:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<!-- //数组扩展
//1.forEach 2.Filter 3.Map 4.Every 5.Some 6.Reduce 7.ReduceRight -->
<script>
var arr=
[ {name:"ww",age:12},
{name:"qq",age:13},
{name:"yy",age:14},
{name:"kk",age:15}
]
var obj={name:"www"}
var obj={name:"www"}
//原型链上写自己的myForEach方法
Array.prototype.myForEach=function(func){
var _self=this;
for(var i=0;i<_self.length;i++){
func.apply(arguments[1]||window,[_self[i],i,_self])
}
}
arr.myForEach(function(ele,index,self){
console.log(ele,this);
},obj)
//可传两个参数,第二个为第一个参数里的this指向
2.filter
Array.prototype.myFilter=function(func){
var _self=this;
var len=_self.length;
var newArr=[];
for(var i=0;i<len;i++){
if(func.apply(arguments[1]||window,[_self[i],i,_self])){
newArr.push(_self[i]);
}
}
return newArr;
}
// var newArr=arr.myFilter(function(ele,index,self){
// return ele.age>14;
// },obj)
// console.log(newArr)
3.map
Array.prototype.myMap=function(func){
var _self=this;
var len=_self.length;
var newArr=[];
for(var i=0;i<len;i++){
newArr.push(clone(func.apply(arguments[1]||window,[_self[i],i,_self])));//优化--clone深度克隆(原方法没有)
}
return newArr;
}
// var newArr=arr.myMap(function(ele,index,self){
// ele.age+=ele.age;//如果ele是引用值修改会影响原数组
// return ele;
// },obj)
// console.log(newArr,arr);
// newArr[0].name="wgfbqkgw";//修改会影响原数组
// console.log(newArr,arr);
function clone(Origin,Target){
if(Object.prototype.toString.call(Origin)=="[object Object]")
{
var Target=Target||{};
}else if(Object.prototype.toString.call(Origin)=="[object Array]"){
var Target=Target||[];
}
for(var prop in Origin){
if(Origin.hasOwnProperty(prop)){
var a=Object.prototype.toString.call(Origin[prop]);
if(a=="[object Array]" ){
Target[prop]=[];
clone(Origin[prop],Target[prop]);
}else if(a=="[object Object]"){
Target[prop]={};
clone(Origin[prop],Target[prop]);
}else{
Target[prop]=Origin[prop];
}
}
}
return Target;
}
4.every
Array.prototype.myEvery=function(func){
var _self=this;
var len=_self.length;
var flag=true;
for(var i=0;i<len;i++){
if(!func.apply(arguments[1]||window,[_self[i],i,_self])){
flag=false;
break;
}
}
return flag;
}
// var flag=arr.myEvery(function(ele,index,self){
// return ele.age>=12;
// },obj)
// console.log(flag)
5.some
Array.prototype.mySome=function(func){
var _self=this;
var len=_self.length;
var flag=false;
for(var i=0;i<len;i++){
if(func.apply(arguments[1]||window,[_self[i],i,_self])){
flag=true;
break;
}
}
return flag;
}
// var flag=arr.mySome(function(ele,index,self){
// return ele.age>=15;
// },obj)
// console.log(flag);
6.reduce
Array.prototype.myReduce=function(func,initialValue){
var _arr=this,len=this.length;
for(var i=0;i<len;i++){
initialValue=func.apply(arguments[1]||window,[initialValue,_arr[i],i,_arr])
}
return initialValue;
}
var lastValue=arr.myReduce(function(preValue,curValue,index,self){
console.log(preValue,curValue,index,self);
preValue.name=preValue.name+"e";
return preValue
},{name:'e'},obj)