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):
- forEach() 遍歷的范圍在第一次調(diào)用 callback 前就會(huì)確定。調(diào)用 forEach 后添加到數(shù)組中的項(xiàng)不會(huì)被 callback 訪問到。如果已經(jīng)存在的值被改變,則傳遞給 callback 的值是 forEach() 遍歷到他們那一刻的值。已刪除的項(xiàng)不會(huì)被遍歷到。如果已訪問的元素在迭代時(shí)被刪除了(例如使用 shift()),之后的元素將被跳過
- forEach() 為每個(gè)數(shù)組元素執(zhí)行一次 callback 函數(shù);
- 總會(huì)返回undefined值(不反回新的數(shù)組)
-
forEach() 被調(diào)用時(shí),不會(huì)改變原數(shù)組,也就是調(diào)用它的數(shù)組(盡管 callback 函數(shù)在被調(diào)用時(shí)可能會(huì)改變原數(shù)組)。
-
除了拋出異常以外,沒有辦法中止或跳出 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):
- map 方法處理數(shù)組元素的范圍是在 callback 方法第一次調(diào)用之前就已經(jīng)確定了。調(diào)用map方法之后追加的數(shù)組元素不會(huì)被callback訪問。如果存在的數(shù)組元素改變了,那么傳給callback的值是map訪問該元素時(shí)的值。在map函數(shù)調(diào)用后但在訪問該元素前,該元素被刪除的話,則無法被訪問到。
- map 方法會(huì)給原數(shù)組中的每個(gè)元素都按順序調(diào)用一次 callback 函數(shù)。callback 每次執(zhí)行后的返回值(包括 undefined)組合起來形成一個(gè)新數(shù)組。 callback 函數(shù)只會(huì)在有值的索引上被調(diào)用;那些從來沒被賦過值或者使用 delete 刪除的索引則不會(huì)被調(diào)用。
-
map 不修改調(diào)用它的原數(shù)組本身(當(dāng)然可以在 callback 執(zhí)行時(shí)改變原數(shù)組)
- 調(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):
- 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ù)組中
- filter 不會(huì)改變原數(shù)組,它返回過濾后的新數(shù)組。
- 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):
- 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)用。
- every 不會(huì)改變原數(shù)組。
- every 遍歷的元素范圍在第一次調(diào)用 callback 之前就已確定了。在調(diào)用 every 之后添加到數(shù)組中的元素不會(huì)被 callback 訪問到。如果數(shù)組中存在的元素被更改,則他們傳入 callback 的值是 every 訪問到他們那一刻的值。那些被刪除的元素或從來未被賦值的元素將不會(huì)被訪問到
- 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):
- 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)用。
- some() 被調(diào)用時(shí)不會(huì)改變數(shù)組。
- 數(shù)組中有至少一個(gè)元素通過回調(diào)函數(shù)的測試就會(huì)返回true;所有元素都沒有通過回調(diào)函數(shù)的測試返回值才會(huì)為false。
- 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):
- 回調(diào)函數(shù)第一次執(zhí)行時(shí),accumulator 和currentValue的取值有兩種情況:如果調(diào)用reduce()時(shí)提供了initialValue,accumulator取值為initialValue,currentValue取數(shù)組中的第一個(gè)值;如果沒有提供 initialValue,那么accumulator取數(shù)組中的第一個(gè)值,currentValue取數(shù)組中的第二個(gè)值。
- 如果沒有提供initialValue,reduce 會(huì)從索引1的地方開始執(zhí)行 callback 方法,跳過第一個(gè)索引。如果提供initialValue,從索引0開始。
- 如果數(shù)組為空且沒有提供initialValue,會(huì)拋出TypeError 。如果數(shù)組僅有一個(gè)元素(無論位置如何)并且沒有提供initialValue, 或者有提供initialValue但是數(shù)組為空,那么此唯一值將被返回并且callback不會(huì)被執(zhí)行。
- 提供初始值通常更安全
- 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):
- find方法對(duì)數(shù)組中的每一項(xiàng)元素執(zhí)行一次 callback 函數(shù),直至有一個(gè) callback 返回 true。當(dāng)找到了這樣一個(gè)元素后,該方法會(huì)立即返回這個(gè)元素的值,否則返回 undefined。
- 注意 callback 函數(shù)會(huì)為數(shù)組中的每個(gè)索引調(diào)用即從 0 到 length - 1,而不僅僅是那些被賦值的索引,這意味著對(duì)于稀疏數(shù)組來說,該方法的效率要低于那些只遍歷有值的索引的方法。
- find方法不會(huì)改變數(shù)組。
- 在第一次調(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}