map
用途
- 对数组进行映射(对原数组中的每一项做某种操作,操作的结果保存在新数组中返回)
- 不会修改原数组
参数
- map(callback,_this);//(回调函数,this指向)
- callback(item,index,array)//(数组中每一项,每一项下标,数组)
基本使用
var arr = [1,2,3,4]
var newArr = arr.map(function(){
console.log(this);
},document)
var arr = [1,2,3,4]
var newArr = arr.map(function(){
return item*2;
})
console.log(arr,newArr);
封装
Array.prototype.mapNew = function(callback){
if(typeof callback !== 'function'){
throw new Error(callback+'is not a function');
}
var arr =this;
var newArr = [];
var _this = arguments[1] || window;
for(var i=0;i<arr.length;i++){
newArr.push(callback.call(_this,arr[i],i,arr));
}
return newArr;
}
测试
var arr = [1,2,3,4];
var newArr = arr.mapNew(function(item){
return item*2
})
console.log(arr,newArr);
filter
用途
- 数据筛选
- 将所有符合条件的元素放到新数组中返回;如果没有符合条件的元素,则返回一个空数组。
参数
- filter(callback,_this);
- callback(item,index,array)
基本使用
var newArr = arr.filter(function(){
console.log(this)
},document)
var arr = [1,2,3,4];
var newArr = arr.filter(function(){
return item%2 == 0
},document)
console.log(newArr)
封装
Array.prototype.filterNew = function(callback){
if(typeof callback !== 'function'){
throw new Error(callback+'is not a function');
}
var arr = this;
var newArr = [];
var _this = argument[1] || window;
for(var i=0;i<arr.length;i++){
if(callback.call(_this,arr[i],i,arr){
newArr.push(arr[i]);
}
}
return newArr;
}
测试
var arr = [1,2,3,4];
var newArr = arr.filterNew(function(item){
console.log(this);
return item%2 ===0;
})
console.log(arr,newArr);
forEach
特点
基本使用
var arr = [1,2,3,4];
var newArr = [];
arr.forEach(function(item,index,arr){
console.log(this);
newArr.push(item*=2);
},document)
console.log(newArr);
封装
Array.prototype.forEachNew = function(callback){
if(typeof callback !== 'function'){
throw new Error(callback+'is not function');
}
var arr = this;
var _this = arguments[1] || window;
for(var i=0;i<arr.length;i++){
callback.call(_this,arr[i],i,arr);
}
}
reduce
特点
参数
- reduce(callback,initValue);(回调函数;初始值)
- callback(prev,current,index,array)(初始值, 或者计算结束后的返回值;当前元素;当前元素索引;当前数组)
基本使用
var n = arr.reduce(function(pre,curr){
return Math.max(pre,curr)
})
console.log(n);
var arr = [[1,2],[3,4],[5,6,[7,8]]];
function mapArr(arr){
return arr.reduce(function(pre,curr){
return pre.concat(Array.isArray(curr)?mapArr(curr):curr);
},[])
}
console.log(mapArr(arr));
var str = "aabbcc";
var obj = str.split('').reduce(function(pre,cur){
if(pre[cur]){
pre[cur]++;
}else{
pre[cur] = 1;
}
return pre;
},{})
var url = "http://www.baidu.com?username=alley&age=18";
var obj = url.substr(url.indexOf("?")+1).split("&").reduce(function(pre,cur){
var key = cur.split("=")[0];
var val = cur.split("=")[1];
pre[key] = val;
return pre;
},{})
封装
Array.prototype.reduceAlley = function(callback,initVal){
if(typeof callback !== 'function'){
throw new Error(callback+'is not function');
}
var arr = this;
var isInitVal = false;
var prev;
if(initVal){
isInitVal = true;
prev = initVal;
}
for(var i=0;i<arr.length;i++){
if(isInitVal){
prev = callback(prev,arr[i],i,arr);
}else{
prev = arr[i];
isInitVal = true;
}
}
return prev;
}