在JS中的map()、filter()、forEach()、reduce()函式都是對陣列內部的元素進行遍歷,但是他們之間有什麼區別呢?
一、Array.prototype.map()
1、說明
將陣列的所有成員依次傳入引數函式,然後把每一次的執行結果組成一個新陣列返回。
2、語法
var newArray = arr.map(function callback(currentValue, index, array){
//對每個元素的處理
})
// 引數
// currentValue:當前正在處理的元素
// index:正在處理元素的索引
// array:呼叫map方法的陣列(就是.map()前面的,也就是arr)
複製程式碼
3、示例
var arr = [1,2,3,4];
var newArr = arr.map(function(x){
return x = x+1;
});
console.log(newArr , arr);
//newArr:2,3,4,5
//arr:1,2,3,4
複製程式碼
遍歷陣列中的每一個元素,然後對每一個元素執行函式中的處理,最後將返回值組成一個新的陣列返回,原陣列(arr)保持不變。
二、Array.prototype.forEach()
1、說明
對陣列的所有成員依次執行引數函式。但是,forEach方法不返回值,只用來運算元據。
2、語法
var newArray = arr.forEach(function callback(currentValue, index , array){
//函式程式碼
});
// 引數
// currentValue: 當前元素
// index: 當前元素的索引
// array:呼叫forEach的陣列
複製程式碼
3、示例
var arr = [1,2,3,4];
var newArr = arr.forEach(function(x){
return x = x+1;
});
console.log(newArr , arr);
//newArr:undefined
//arr:1,2,3,4
複製程式碼
遍歷陣列中的每一個元素,然後對每一個元素執行函式中的處理,沒有返回值,即使設定了return也無效,原陣列(arr)保持不變。
三、Array.prototype.fliter()
1、說明
過濾陣列成員,滿足條件的成員組成一個新陣列返回。
2、語法
var newArray = arr.filter(function callback(currentValue, index , array){
//函式程式碼
});
// 引數
// currentValue: 當前元素
// index: 當前元素的索引
// array:呼叫filter的陣列
複製程式碼
3、示例
var arr = [1,2,3,4];
var newArr = arr.filter(function(x){
return x > 1;
});
console.log(newArr , arr);
// newArr:2,3,4
// arr:1,2,3,4
複製程式碼
遍歷陣列中的每一個元素,然後對每一個元素執行函式中的處理,最後判斷返回值是否為true,將返回為true的陣列元素(該元素為最原始的陣列元素)組成一個新的陣列返回,原陣列(arr)保持不變。
四、Array.prototype.some()與Array.prototype.every()
1、說明
對陣列的所有成員依次執行引數函式,返回一個布林值。
some()是隻要一個成員的返回值是true,則整個some()的返回值就是true,否則返回false。
every()是所有成員的返回值都是true,整個every()才返回true,否則返回false。
2、語法
var newArray = arr.some(function callback(currentValue, index , array){
//函式程式碼
});
// 引數
// currentValue: 當前元素
// index: 當前元素的索引
// array:呼叫filter的陣列
var newArray = arr.every(function callback(currentValue, index , array){
//函式程式碼
});
// 引數
// currentValue: 當前元素
// index: 當前元素的索引
// array:呼叫filter的陣列
複製程式碼
3、示例
// 以some()為例:
var arr = [1,2,3,4];
var newArr = arr.some(function(x){
return x > 1;
});
console.log(newArr , arr);
// newArr:true
// arr:1,2,3,4
複製程式碼
遍歷陣列中的每一個元素,然後對每一個元素執行函式中的處理,最後判斷返回值是否為true,
如果有一個成員返回值為true,則some()返回true,
如果所有成員返回值都為true,則every()返回true,
原陣列(arr)保持不變。
五、Array.prototype.reduce()
1、說明
使用函式依次處理陣列的每個成員,最終累計為一個值。
2、語法
//語法
var newArray = arr.reduce(callback(previousValue, currentValue, currentIndex,array){
//函式程式碼
},initialValue);
//引數
// previousValue: 上一次呼叫函式後的返回值,或者是提供的初始值(initialValue)
// currentValue:當前陣列的元素
// currentIndex:當前陣列元素的索引
// array:呼叫reduce的陣列
// initialValue:初始值,作為第一次呼叫callback的第一個引數,也可不寫,預設為0;
複製程式碼
3、示例
var arr = [1,2,3,4];
var newArr = arr.reduce(function(total, current){
return total + current;
},100);
console.log(newArr,arr);
// newArr:110
// arr:1,2,3,4
複製程式碼
遍歷陣列中的每一個元素,然後對每一個元素執行函式中的處理,返回值會被記住,並且在遍歷下一個元素中可以被呼叫,最後返回單個結果值,原陣列(arr)保持不變。
六、區別總結
以上介紹的這些方法都是依次使用函式處理陣列中的每一個成員,但是都有細微的差別,下面將整理各個函式中的差別。
map(): 在處理函式中將返回值組成一個新的陣列返回,原陣列(arr)保持不變。
forEach(): 沒有返回值,即使處理函式中設定了return也無效,原陣列(arr)保持不變。
filter(): 判斷處理函式中的返回值是否為true,將返回為true的陣列元素(該元素為最原始的陣列元素)組成一個新的陣列返回,原陣列(arr)保持不變。
some()與every(): 判斷處理函式中的返回值是否為true,如果有一個成員返回值為true,則some()返回true;如果所有成員返回值都為true,則every()返回true,原陣列(arr)保持不變。
reduce(): 返回值會被記住,並且在遍歷下一個元素中可以被呼叫,最後返回單個結果值,原陣列(arr)保持不變。