js 數(shù)組常用的遍歷方法總結(jié)

forEach()

語法:

arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
  • callback: 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • currentValue 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array forEach() 方法正在操作的數(shù)組。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:undefined(沒有返回值)

特點(diǎn):

  1. forEach() 遍歷的范圍在第一次調(diào)用 callback 前就會(huì)確定。調(diào)用 forEach 后添加到數(shù)組中的項(xiàng)不會(huì)被 callback 訪問到。如果已經(jīng)存在的值被改變,則傳遞給 callback 的值是 forEach() 遍歷到他們那一刻的值。已刪除的項(xiàng)不會(huì)被遍歷到。如果已訪問的元素在迭代時(shí)被刪除了(例如使用 shift()),之后的元素將被跳過
  2. forEach() 為每個(gè)數(shù)組元素執(zhí)行一次 callback 函數(shù);
  3. 總會(huì)返回undefined值(不反回新的數(shù)組)
  4. forEach() 被調(diào)用時(shí),不會(huì)改變原數(shù)組,也就是調(diào)用它的數(shù)組(盡管 callback 函數(shù)在被調(diào)用時(shí)可能會(huì)改變原數(shù)組)。
  5. 除了拋出異常以外,沒有辦法中止或跳出 forEach() 循環(huán)。如果你需要中止或跳出循環(huán),forEach() 方法不是應(yīng)當(dāng)使用的工具。

eg:

let arr = ['one', 'two', 'three'];
arr.forEach((item, index, array) => {
    console.log(`數(shù)組中正在處理的當(dāng)前元素: ${item}`)
    console.log(`數(shù)組中正在處理的當(dāng)前元素的索引: ${index}`)
    console.log(`forEach() 方法正在操作的數(shù)組:  ${array}`)
})

map()

語法:

var new_array = arr.map(callback(currentValue[, index[, array]]) {
    Return element for new_array 
}[, thisArg])
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • currentValue 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array 調(diào)用了 map() 的數(shù)組本身。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:一個(gè)新的數(shù)組

特點(diǎn):

  1. map 方法處理數(shù)組元素的范圍是在 callback 方法第一次調(diào)用之前就已經(jīng)確定了。調(diào)用map方法之后追加的數(shù)組元素不會(huì)被callback訪問。如果存在的數(shù)組元素改變了,那么傳給callback的值是map訪問該元素時(shí)的值。在map函數(shù)調(diào)用后但在訪問該元素前,該元素被刪除的話,則無法被訪問到。
  2. map 方法會(huì)給原數(shù)組中的每個(gè)元素都按順序調(diào)用一次 callback 函數(shù)。callback 每次執(zhí)行后的返回值(包括 undefined)組合起來形成一個(gè)新數(shù)組。 callback 函數(shù)只會(huì)在有值的索引上被調(diào)用;那些從來沒被賦過值或者使用 delete 刪除的索引則不會(huì)被調(diào)用。
  3. map 不修改調(diào)用它的原數(shù)組本身(當(dāng)然可以在 callback 執(zhí)行時(shí)改變原數(shù)組)
  4. 調(diào)用后會(huì)返回一個(gè)新的數(shù)組

eg:

let arr = [1, 2, 3, 4, 5];
let newArr = arr.map((item, index, array) => item * 10);
console.log(arr)          //[1, 2, 3, 4, 5]
console.log(newArr)    //[10, 20, 30, 40, 50]

filter() 過濾器

語法:

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • element 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array 調(diào)用了 filter() 的數(shù)組本身。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:一個(gè)新的數(shù)組

特點(diǎn):

  1. filter 為數(shù)組中的每個(gè)元素調(diào)用一次 callback 函數(shù),并利用所有使得 callback 返回 true 或等價(jià)于 true 的值的元素創(chuàng)建一個(gè)新數(shù)組。callback 只會(huì)在已經(jīng)賦值的索引上被調(diào)用,對(duì)于那些已經(jīng)被刪除或者從未被賦值的索引不會(huì)被調(diào)用。那些沒有通過 callback 測試的元素會(huì)被跳過,不會(huì)被包含在新數(shù)組中
  2. filter 不會(huì)改變原數(shù)組,它返回過濾后的新數(shù)組。
  3. filter 遍歷的元素范圍在第一次調(diào)用 callback 之前就已經(jīng)確定了。在調(diào)用 filter 之后被添加到數(shù)組中的元素不會(huì)被 filter 遍歷到。如果已經(jīng)存在的元素被改變了,則他們傳入 callback 的值是 filter 遍歷到它們那一刻的值。被刪除或從來未被賦值的元素不會(huì)被遍歷到。

eg:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let newArr = arr.filter((item, index, aray) => item % 2 == 0);
console.log(arr)//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(newArr)//[0, 2, 4, 6, 8, 10]

every()

語法:

arr.every(callback(element[, index[, array]])[, thisArg])
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • element 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array 調(diào)用 every() 的當(dāng)前數(shù)組。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:如果回調(diào)函數(shù)的每一次返回都為 真值,返回 true ,否則返回 false。

特點(diǎn):

  1. every 方法為數(shù)組中的每個(gè)元素執(zhí)行一次 callback 函數(shù),直到它找到一個(gè)會(huì)使 callback 返回 falsy 的元素。如果發(fā)現(xiàn)了一個(gè)這樣的元素,every 方法將會(huì)立即返回 false。否則,callback 為每一個(gè)元素返回 true,every 就會(huì)返回 true。callback 只會(huì)為那些已經(jīng)被賦值的索引調(diào)用。不會(huì)為那些被刪除或從未被賦值的索引調(diào)用。
  2. every 不會(huì)改變原數(shù)組。
  3. every 遍歷的元素范圍在第一次調(diào)用 callback 之前就已確定了。在調(diào)用 every 之后添加到數(shù)組中的元素不會(huì)被 callback 訪問到。如果數(shù)組中存在的元素被更改,則他們傳入 callback 的值是 every 訪問到他們那一刻的值。那些被刪除的元素或從來未被賦值的元素將不會(huì)被訪問到
  4. every 和數(shù)學(xué)中的"所有"類似,當(dāng)所有的元素都符合條件才會(huì)返回true。正因如此,若傳入一個(gè)空數(shù)組,無論如何都會(huì)返回 true。(這種情況屬于無條件正確:正因?yàn)橐粋€(gè)空集合沒有元素,所以它其中的所有元素都符合給定的條件。)

eg:

let arr = [0, 1, 2, 3, 4, 5, 6]
console.log(arr.every((item, index, array) => item >= 0)) 
//如果都大于等于0 返回true 只要有一個(gè)小于0就返回false

some()

語法:

arr.some(callback(element[, index[, array]])[, thisArg])
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • element 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array some()被調(diào)用的數(shù)組。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:數(shù)組中有至少一個(gè)元素通過回調(diào)函數(shù)的測試就會(huì)返回true;所有元素都沒有通過回調(diào)函數(shù)的測試返回值才會(huì)為false。

特點(diǎn):

  1. some() 為數(shù)組中的每一個(gè)元素執(zhí)行一次 callback 函數(shù),直到找到一個(gè)使得 callback 返回一個(gè)“真值”(即可轉(zhuǎn)換為布爾值 true 的值)。如果找到了這樣一個(gè)值,some() 將會(huì)立即返回 true。否則,some() 返回 false。callback 只會(huì)在那些”有值“的索引上被調(diào)用,不會(huì)在那些被刪除或從來未被賦值的索引上調(diào)用。
  2. some() 被調(diào)用時(shí)不會(huì)改變數(shù)組。
  3. 數(shù)組中有至少一個(gè)元素通過回調(diào)函數(shù)的測試就會(huì)返回true;所有元素都沒有通過回調(diào)函數(shù)的測試返回值才會(huì)為false。
  4. some() 遍歷的元素的范圍在第一次調(diào)用 callback. 前就已經(jīng)確定了。在調(diào)用 some() 后被添加到數(shù)組中的值不會(huì)被 callback 訪問到。如果數(shù)組中存在且還未被訪問到的元素被 callback 改變了,則其傳遞給 callback 的值是 some() 訪問到它那一刻的值。已經(jīng)被刪除的元素不會(huì)被訪問到。

eg:

let arr = [0, 1, 2, 3, 4, 5, 6]
console.log(arr.some((item, index, array) => item >= 6)) 
//只要數(shù)組中有一項(xiàng)滿足回調(diào)函數(shù)中設(shè)置的條件就返回true;

reduce() 疊加器

語法:

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • accumulator 累計(jì)器累計(jì)回調(diào)的返回值; 它是上一次調(diào)用回調(diào)時(shí)返回的累積值。
    • currentValue 數(shù)組中正在處理的元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。 如果提供了initialValue,則起始 索引號(hào)為0,否則從索引1起始。
    • array some()被調(diào)用的數(shù)組。
  • initialValue 可選參數(shù)。作為第一次調(diào)用 callback函數(shù)時(shí)的第一個(gè)參數(shù)的值。 如果沒有提供初始值,則將使用數(shù)組中的第一個(gè)元素。 在沒有初始值的空數(shù)組上調(diào)用 reduce 將報(bào)錯(cuò)。
  • 返回值:函數(shù)累計(jì)處理的結(jié)果

特點(diǎn):

  1. 回調(diào)函數(shù)第一次執(zhí)行時(shí),accumulator 和currentValue的取值有兩種情況:如果調(diào)用reduce()時(shí)提供了initialValue,accumulator取值為initialValue,currentValue取數(shù)組中的第一個(gè)值;如果沒有提供 initialValue,那么accumulator取數(shù)組中的第一個(gè)值,currentValue取數(shù)組中的第二個(gè)值。
  2. 如果沒有提供initialValue,reduce 會(huì)從索引1的地方開始執(zhí)行 callback 方法,跳過第一個(gè)索引。如果提供initialValue,從索引0開始。
  3. 如果數(shù)組為空且沒有提供initialValue,會(huì)拋出TypeError 。如果數(shù)組僅有一個(gè)元素(無論位置如何)并且沒有提供initialValue, 或者有提供initialValue但是數(shù)組為空,那么此唯一值將被返回并且callback不會(huì)被執(zhí)行。
  4. 提供初始值通常更安全
  5. reduce() 被調(diào)用時(shí)不會(huì)改變數(shù)組。

eg:

let goodsList = [
    {
        id: 0,
        goods_name: '商品1', //商品名
        goods_num: 1, //商品數(shù)量
        goods_much: 300 //商品價(jià)格
    },
    {
        id: 1,
        goods_name: '商品2',
        goods_num: 2,
        goods_much: 15
    },
    {
        id: 2,
        goods_name: '商品3',
        goods_num: 3,
        goods_much: 10
    },
    {
        id: 3,
        goods_name: '商品4',
        goods_num: 1,
        goods_much: 100
    },
    {
        id: 4,
        goods_name: '商品5',
        goods_num: 1,
        goods_much: 20
    },
]
let delivery = 3; //配送費(fèi)
let sum = goodsList.reduce((acc, item) => acc + item.goods_num * item.goods_much, delivery);
console.log(`商品總額加配送費(fèi)一共:${sum}元`)//商品總額加配送費(fèi)一共:483元

find()

語法:

arr.find(callback(element[, index[, array]]), thisArg)
  • callback 為數(shù)組中每個(gè)元素執(zhí)行的函數(shù),該函數(shù)接收一至三個(gè)參數(shù):
    • element 數(shù)組中正在處理的當(dāng)前元素。
    • index 數(shù)組中正在處理的當(dāng)前元素的索引。
    • array 數(shù)組本身。
  • thisArg 可選參數(shù)。當(dāng)執(zhí)行回調(diào)函數(shù) callback 時(shí),用作 this 的值。
  • 返回值:數(shù)組中第一個(gè)滿足所提供測試函數(shù)的元素的值,否則返回 undefined。

特點(diǎn):

  1. find方法對(duì)數(shù)組中的每一項(xiàng)元素執(zhí)行一次 callback 函數(shù),直至有一個(gè) callback 返回 true。當(dāng)找到了這樣一個(gè)元素后,該方法會(huì)立即返回這個(gè)元素的值,否則返回 undefined。
  2. 注意 callback 函數(shù)會(huì)為數(shù)組中的每個(gè)索引調(diào)用即從 0 到 length - 1,而不僅僅是那些被賦值的索引,這意味著對(duì)于稀疏數(shù)組來說,該方法的效率要低于那些只遍歷有值的索引的方法。
  3. find方法不會(huì)改變數(shù)組。
  4. 在第一次調(diào)用 callback函數(shù)時(shí)會(huì)確定元素的索引范圍,因此在 find方法開始執(zhí)行之后添加到數(shù)組的新元素將不會(huì)被 callback函數(shù)訪問到。如果數(shù)組中一個(gè)尚未被callback函數(shù)訪問到的元素的值被callback函數(shù)所改變,那么當(dāng)callback函數(shù)訪問到它時(shí),它的值是將是根據(jù)它在數(shù)組中的索引所訪問到的當(dāng)前值。被刪除的元素仍舊會(huì)被訪問到,但是其值已經(jīng)是undefined了。

eg:

let arr = [
    { x: 1 },
    { x: 2 },
    { x: 3 },
    { x: 4 }
]
let obj = arr.find(item => item.x == 2)
console.log(obj)//{x: 2}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容