1. 程式人生 > >.map()和.filter()以及他們的區別

.map()和.filter()以及他們的區別

今天看到朋友寫的一個數組對比,用的filter(),於是就想想起map(),都是對內部的元素一個一個去遍歷,然後輸出,到底有什麼區別的。
先說下,jquery也有這兩個方法,不過大家都懂得,他們都是對JavaScript進行的封裝,我這裡只說下JavaScript的。

我們說的map()和filter()其實是:
Array.prototype.map()
建立一個新的陣列,其結果是該陣列中每個元素都呼叫一個提供的函式後返回的結果。
語法
var newArray = arr.map(function callback(currentValue, index, array){
//對每個元素的處理
})
引數


callback:用來生成新陣列用的函式。
callback的引數:
currentValue:當然正在處理的元素
index:正在處理元素的索引
array:呼叫map方法的陣列(就是.map()前面的也就是arr)

var a = [1,2,3,4];
var newa = a.map(function(x){
 return x = x+1;
});
console.log(newa,a); 
//newa : 2 3 4 5   //a: 1 2 3 4

Array.prototype.filter()
建立一個新陣列,其結果是呼叫一個函式後過濾得的元素。
語法


var newArray = arr.filter(function callback(curValue, index , array){
//函式程式碼
});
引數
callback: 呼叫的過濾函式
curValue: 當前元素
index: 當前元素的索引
array:呼叫filter的陣列

var a = [1,2,3,4];
var newa = a.filter(function(x){
 return x > 1;
});
console.log(newa,a); 
//newa : 2 3 4    //a: 1 2 3 4

基本用法就是以上那些
因為都是對元素的遍歷,所以我猜想 如果把map中呼叫的函式換成filter裡面的過濾函式是否能得到相同的結果呢。
於是

var a = [1,2,3,4];
var newa = a.map(function(x){
 return x > 1;
});
console.log(newa,a); 
//newa :false true true true     //a: 1 2 3 4

可以看出來newa 的到的並不是數字,它們只是對當前元素呼叫函式後(x是否大於1)的結果。而filter 會將結果為true的陣列存到新的數組裡面。

另外還有兩個常用的遍歷函式
Array.prototype.forEach()
陣列的每一個元素執行一次提供的函式。

var a = [1,2,3,4];
var newa = a.forEach(function(x){
 return x > 1;
});
console.log(newa,a);  //undifined  //1 2 3 4 
var a = [1,2,3,4];
var newa = a.forEach(function(x){
 console.log(x);
});
console.log(newa,a);  
//1
//2
//3
//4
//undifined  //1 2 3 4 

從上面可以看出forEach 只是讓數組裡面的元素執行一次函式,並不會對原陣列產生影響,也不會獲得新的陣列
Array.prototype.reduce()
接受一個函式作為累加器,依次加上陣列的當前元素。
語法
arr.reduce(callback(previousValue, currentValue, currentIndex,array),initialValue);
引數
callback:累加器函式
previousValue: 上一次呼叫函式後的返回值,或者是提供的初始值(initialValue)
currentValue:當前陣列的元素
currentIndex:當前陣列元素的索引
array:呼叫reduce的陣列
initialValue:初始值,作為第一次呼叫callback的第一個引數,也可不寫,預設為0;

var a = [1,2,3,4];
var new = a.reduce(function(total, current){
 return total + current;
},100);
console.log(new,a);
//10   //1 2 3 4

其實上面介紹的全是遍歷函式,但都有細微的差別,每個都各司其職(好像有點廢話),所以當想改變陣列的時候用map,想對陣列進行過濾用filter,累加陣列用reduce。
不過看了上面的概念和栗子,我想你能更準確的使用它們,那麼沒問題了,哈哈。

如有錯誤請指出,前端小白在學習。