WeHelp
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 的觀點,在符合使用情境的狀況下,推薦使用陣列內建的方法來處理各種和陣列有關的操作。不過,在實際的開發場景中,我們仍然會根據當下實際要解決的程式問題、甚至更進一步的考量人力、時程、商業條件等,決定最後要使用的程式技巧。