JavaScript Array 陣列的 forEach()、some()﹑every() 方法
2024-07-11 01:39:50
## 陣列物件的操作方法
JavaScript 陣列物件提供了非常多可以用來逐一檢視陣列資料的方法,在函式化的程式設計模式中 ( Functional Programming ),適當的使用陣列內建的方法來操作陣列中的資料,比起傳統的 for 迴圈,可以有效的提高程式的可讀性。以下特別介紹 Array.forEach()、Array.some()、和 Array.every() 三種方法,以及其對應的 for 迴圈寫法,讓大家參考比較。
----
## 使用 forEach 方法,逐一取得陣列中的資料
`Array.forEach(callback)` 方法幫助我們按照順序、逐一取得陣列中的資料。
例如我們要印出陣列中的每個資料和其對應的索引編號,使用 for 迴圈可以這樣寫:
``` js
let data=[3, 2, 1, 5, 4];
for(let i=0; i<data.length; i++){
console.log(data[i], i);
}
```
使用 forEach 方法,傳入一個 callback 回呼函式,該回呼函式可以逐一取得陣列中的資料,並決定要做的事情,範例如下:
``` js
let data=[3, 2, 1, 5, 4];
data.forEach((item, index)=>{
console.log(item, index);
});
```
----
## 使用 some 方法,檢查陣列中是否有資料符合某個條件
`Array.some(callback)` 方法幫助我們按照順序、逐一檢查陣列中的資料是否符合某個條件,只要其中一個檢查到的資料符合條件,則回傳 true,並中斷巡迴陣列的動作;若所有資料都不符合條件,則回傳 false。
例如我們要檢查陣列中是否「包含」偶數,只要有一個偶數存在,就回報 true,並中斷檢查。使用 for 迴圈搭配 break 指令可以這樣寫:
``` js
let data=[3, 2, 1, 5, 4];
let ans=false; // 預設為不包含
for(let i=0; i<data.length; i++){
console.log(data[i]); // 只印出 3 和 2,後續被中斷
if(data[i]%2===0){
ans=true;
break; // 已確定包含偶數,終止迴圈運作
}
}
console.log(ans); // 印出 true,因為包含偶數 2
```
這樣的情況下,若使用 forEach 方法,則沒辦法像傳統的 for 迴圈一樣使用 break 做到中斷巡迴陣列這件事情,造成很多不必要的運算。此時,some 方法就是一個非常好的解決方案。
使用 some 方法,傳入一個回呼函式,該回呼函式可以逐一取得陣列中的資料,檢查取得的資料是否滿足某個條件,若滿足,則回傳 true,並中斷巡迴陣列,範例如下:
``` js
let data=[3, 2, 1, 5, 4];
let ans=data.some((item)=>{
console.log(item); // 只印出 3 和 2,後續被中斷
return item%2===0; // 偶數則回傳 true,同時會中斷巡迴陣列,整個 some 方法也回傳 true
});
console.log(ans); // 印出 true,因為包含偶數 2
```
----
## 使用 every 方法,檢查陣列中是否所有資料都符合某個條件
`Array.every(callback)` 方法幫助我們按照順序、逐一檢查陣列中的資料是否符合某個條件,如果所有資料都符合條件,則回傳 true;如果其中一個資料不符合條件,則回傳 false,並中斷巡迴陣列的動作。
例如我們要檢查陣列中是否「所有」資料都是偶數,只要有一個不是偶數,就回報 false,並中斷檢查。使用 for 迴圈搭配 break 指令可以這樣寫:
``` js
let data=[2, 3, 1, 5, 4];
let ans=true; // 預設為所有資料都是偶數
for(let i=0; i<data.length; i++){
console.log(data[i]); // 只印出 2 和 3,後續被中斷
if(data[i]%2!==0){
ans=false;
break; // 已確定有非偶數的資料,終止迴圈運作
}
}
console.log(ans); // 印出 false,因為包含非偶數 3
```
這樣的情況下,若使用 forEach 方法,則沒辦法像傳統的 for 迴圈一樣使用 break 做到中斷巡迴陣列這件事情,造成很多不必要的運算。此時,every 方法就是一個非常好的解決方案。
使用 every 方法,傳入一個回呼函式,該回呼函式可以逐一取得陣列中的資料,檢查取得的資料是否滿足某個條件,若不滿足,則回傳 false,並中斷巡迴陣列,範例如下:
``` js
let data=[2, 3, 1, 5, 4];
let ans=data.every((item)=>{
console.log(item); // 只印出 2 和 3,後續被中斷
return item%2===0; // 非偶數則回傳 false,同時會中斷巡迴陣列,整個 every 方法也回傳 false
});
console.log(ans); // 印出 false,因為包含非偶數 3
```
----
相對於調用 JavaScript 陣列內建的方法,具有可讀性的優勢;使用 for 迴圈則有最大的開發彈性和一般性,可以應對各種情況。
本文特別強調 Functional Programming 的觀點,在符合使用情境的狀況下,推薦使用陣列內建的方法來處理各種和陣列有關的操作。不過,在實際的開發場景中,我們仍然會根據當下實際要解決的程式問題、甚至更進一步的考量人力、時程、商業條件等,決定最後要使用的程式技巧。
點擊複製文章連結
X