forEach(callback[,object]) ES5新增遍历方法
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<script type="text/javascript">
//常用数组方法
//foreach方法
var personArr = [
{
name : "张三",
sex : "男",
age : 18,
dec : "你好"
},
{
name : "李四",
sex : "男",
age : 19,
dec : "你真帅"
},
{
name : "王五",
sex : "女",
age : 18,
dec : "长头发"
},
{
name : "赵六",
sex : "男",
age : 20,
dec : "憨憨的"
},
{
name : "孙七",
sex : "女",
age : 19,
dec : "傻白甜"
},
{
name : "刘八",
sex : "男",
age : 25,
dec : "抽烟喝酒打牌"
}
];
//forEach(callback[,object]) ES5新增遍历方法
personArr.forEach(function(ele,index,self){
//console.log(ele,index,self);
//ele 数组的每一项
//index 索引
//self数组本身
console.log(this);//指向的时window
},{name:"jack"});//传第二个对象参数 改变this的指向
personArr.forEach(function(ele,index,self){
this[index].innerHTML=ele.name;
},document.getElementsByTagName("li"));//改变this指向
</script>
</body>
</html>
自己封装forEach:
Array.prototype.myForEach=function(func){
//this指向window
var _arr=this;//数组备份
var len=_arr.length;
var param2=arguments[1]||window;
for(var i=0;i<len;i++){
func.apply(param2,[_arr[i],i,_arr]);
}
}
personArr.myForEach(function(ele,index,self){
console.log(ele,index,self);
this[index].innerHTML=ele.name;
},document.getElementsByTagName("li"));//改变this指向
filter过滤 返回一个boolean 如果为true留在新数组中 否则不留
var newArr=personArr.filter(function(ele,index,self){
//console.log(ele,index,self);
console.log(this);//默认是window
//过滤 如果性别是男加入新数组
if(ele.sex=="男"){
return true;
}else{
return false;
}
},{name:"jack"});
console.log(newArr);
自己封装filter方法:
Array.prototype.myFilter=function(func){
var _arr=this;
var len=_arr.length;
var param2=arguments[1]||window;
var newArr=[];
for(var i=0;i<len;i++){
func.apply(param2,[_arr[i],i,_arr])?newArr.push(_arr[i]):"";
}
return newArr;
}
var newArr=personArr.myFilter(function(ele,index,self){
console.log(ele,index,self);
console.log(this);//默认是window
//过滤 如果性别是男加入新数组
if(ele.sex=="男"){
return true;
}else{
return false;
}
},{name:"jack"});
console.log(newArr);
map 返回一个新的数组 可以对原数组里面的参数进行修改
var newArr=personArr.map(function(ele,index,self){
//console.log(ele,index,self);
//console.log(this);
ele.age+=10;
return ele.age;
},{name:"jack"});
console.log(newArr);
自己封装map
Array.prototype.myMap=function(func){
var _arr=this;
var len=_arr.length;
var param2=arguments[1]||window;
var newArr=[];
for(var i=0;i<len;i++){
newArr.push(func.apply(param2,[_arr[i],i,_arr]));
}
return newArr;
}
var newArr=personArr.myMap(function(ele,index,self){
//console.log(ele,index,self);
//console.log(this);
ele.age+=10;
return ele.age;
},{name:"jack"});
console.log(newArr);
every some 返回一个boolean值
every 所有为true才为true
some 一个为true就为true
var flag=personArr.every(function(ele,index,self){
console.log(ele,index,self,this);
//return true;
return ele.age>18;//判断年龄是否都大于18岁 如果全部都大于返回true否则返回false
},{name:"jack"});
console.log(flag);
自己封装every
Array.prototype.myEvery=function(func){
var _arr=this;
var len=_arr.length;
var param2=arguments[1]||window;
var flag=true;
for(var i=0;i<len;i++){
if(!func.apply(param2,[_arr[i],i,_arr])){
flag=false;
break;
}
}
return flag;
}
var flag=personArr.myEvery(function(ele,index,self){
console.log(ele,index,self,this);
//return true;
return ele.age>18;//判断年龄是否都大于18岁 如果全部都大于返回true否则返回false
},{name:"jack"});
console.log(flag);
reduce 上一次执行完成的返回值 作为下一次执行的初始值
personArr.reduce(function(prevValue,ele,index,self){
//prevValue 以前的值
//第二个参数代表初始值,不代表改变this指向
console.log(prevValue,ele,index,self);
return prevValue;//第一次执行完成的返回值 作为下一次执行的初始值
},{name:"Jack"});
reduce自己封装
Array.prototype.myReduce=function(func,initValue){
var _arr=this;
var len=_arr.length;
var param2=arguments[2]||window;
for(var i=0;i<len;i++){
initValue=func.apply(param2,[initValue,_arr[i],i,_arr]);
}
return initValue;
}
personArr.myReduce(function(prevValue,ele,index,self){
//prevValue 以前的值
//第二个参数代表初始值,不代表改变this指向
console.log(prevValue,ele,index,self);
return 123;//第一次执行完成的返回值 作为下一次执行的初始值
},{name:"Jack"});