JS 基礎篇(七):JS中的遍歷函式

Madman0621發表於2019-02-15

在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)保持不變。

參考資料:
.map()和.filter()以及他們的區別
網道-Array
MDN-Array

相關文章