JavaScript?映射器?array.flatMap()
前言:
array.map() 是一個非常有用的映射函數(shù):它接收一個數(shù)組和一個映射函數(shù),然后返回一個新的映射數(shù)組。
然而,有一個替代 array.map()
的方法:array.flatMap()
(從ES2019開始可用)。這個方法給了我們映射的能力,但也可以在生成的映射數(shù)組中刪除甚至添加新的項目。
1. 更加智能的映射器
有一個數(shù)字?jǐn)?shù)組,我們要如何創(chuàng)建一個新的數(shù)組,使用每個數(shù)字加倍?
使用array.map()
函數(shù)是一個好方法。
const numbers = [0, 3, 6]; const doubled = numbers.map(n => n * 2); console.log(doubled); // logs [0, 6, 12]
numbers.map(number => 2 * number)
將 number
數(shù)組映射到一個新的數(shù)組,其中每個數(shù)字都被翻倍。
對于需要一對一映射的情況,也就是說,映射后的數(shù)組與原始數(shù)組的項數(shù)相同,array.map()
的效果非常好。
但如果我們需要將一個數(shù)組的數(shù)字翻倍,同時跳為0的項,該怎么辦?
直接使用 array.map()
是不可能的,因為該方法總是創(chuàng)建一個映射的數(shù)組,其項數(shù)與原數(shù)組相同。但是我們可以使用 array.map()和 array.filter()
的組合。
const numbers = [0, 3, 6]; const doubled = numbers ? .filter(n => n !== 0) ? .map(n => n * 2); console.log(doubled); // logs [6, 12]
array.map()和 array.filter()
可以解決問題,但有沒有更簡短的方法?
必須滴。使用 array.flatMap()
方法,只需調(diào)用一個方法就可以執(zhí)行映射和刪除項目。
const numbers = [0, 3, 6]; const doubled = numbers.flatMap(number => { ? return number === 0 ? [] : [2 * number]; }); console.log(doubled); // logs [6, 12]
通過只使用numbers.flatMap()
,你可以將一個數(shù)組映射到另一個數(shù)組,但也可以從映射中跳過某些元素。
接著,我們來更詳細(xì)地看看 array.flatMap()
是如何工作的。
2. array.flatMap()
array.flatMap()
函數(shù)接受一個回調(diào)函數(shù)作為參數(shù)并返回一個新的映射數(shù)組
const mappedArray = array.flatMap((item, index, origArray) => { ? // ... ? return [value1, value2, ..., valueN]; }[, thisArg]);
回調(diào)函數(shù)在原數(shù)組中的每個iteam
上被調(diào)用,有3個參數(shù):當(dāng)前項、索引和原數(shù)組。然后,回調(diào)函數(shù)返回的數(shù)組被扁平化了1層,得到的項目被添加到映射的數(shù)組中。
此外,該方法還接受第二個可選參數(shù),表示回調(diào)內(nèi)部的 this
值。
使用array.flatmap()
最簡單的方法是將包含項目的數(shù)組扁平化
const arrays = [[2, 4], [6]]; const flatten = arrays.flatMap(item => item); console.log(flatten); // logs [2, 4, 6]
但是array.flatMap()
除了簡單的扁平化之外,還可以做更多的事情。通過控制從回調(diào)中返回的數(shù)組項的數(shù)量:
- 通過返回一個空數(shù)組從結(jié)果數(shù)組中刪除該項
- 通過返回一個帶有一個新值的數(shù)組 [newValue] 來修改映射的項
- 通過返回一個包含多個值的數(shù)組來添加新項: [newValue1, newValue2, ...]
例如:正如你在上一節(jié)中所看到的,可以通過將項目加倍來創(chuàng)建一個新的數(shù)組,但同時也要刪除 0。
const numbers = [0, 3, 6]; const doubled = numbers.flatMap(number => { ? return number === 0 ? [] : [2 * number]; }); console.log(doubled); // logs [6, 12]
現(xiàn)在,我們來看下它是怎么工作的。
如果當(dāng)前項為 0,回調(diào)函數(shù)返回一個空數(shù)組 []。這意味著當(dāng)被扁平化時,空數(shù)組[]沒有提供任何值。
如果當(dāng)前迭代項非零,則返回 [2 * number]。當(dāng)扁平[2 * number]數(shù)組時,結(jié)果數(shù)組中只添加2 * number。
你也可以使用 array.flatMap()
來增加映射的數(shù)組中的項目數(shù)量。
例如,下面的代碼片段通過添加兩倍和三倍的數(shù)字將一個數(shù)字?jǐn)?shù)組映射到一個新數(shù)組:
const numbers = [1, 4]; const trippled = numbers.flatMap(number => { ? return [number, 2 * number, 3 * number]; }); console.log(trippled); // logs [1, 2, 3, 4, 8, 12]
3. 總結(jié)
如果想把一個數(shù)組映射到一個新的數(shù)組中,同時又能控制想在新的映射數(shù)組中添加多少項,那么array.flatMap()
方法就是一個好辦法。
array.flatMap(callback)
的回調(diào)函數(shù)被調(diào)用,有3個參數(shù):當(dāng)前迭代的項、索引和原始數(shù)組。然后,從回調(diào)函數(shù)返回的數(shù)組在1層深處被扁平化,得到的項目被插入到所產(chǎn)生的映射數(shù)組中。
到此這篇關(guān)于JavaScript
映射器array.flatMap()
的文章就介紹到這了,更多相關(guān)JavaScript 映射器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)JavaScript設(shè)計模式之享元模式
這篇文章主要為大家介紹了JavaScript設(shè)計模式中的享元模式,對JavaScript設(shè)計模式感興趣的小伙伴們可以參考一下2016-01-01javascript實現(xiàn)的字符串轉(zhuǎn)換成數(shù)組操作示例
這篇文章主要介紹了javascript實現(xiàn)的字符串轉(zhuǎn)換成數(shù)組操作,涉及javascript字符串與數(shù)組相互轉(zhuǎn)換、以及數(shù)組反轉(zhuǎn)相關(guān)操作技巧,需要的朋友可以參考下2019-06-06JavaScript實現(xiàn)網(wǎng)頁加載進(jìn)度條代碼超簡單
網(wǎng)頁進(jìn)度條能夠更好的反應(yīng)當(dāng)前網(wǎng)頁的加載進(jìn)度情況,loading進(jìn)度條可用動畫的形式從開始0%到100%完成網(wǎng)頁加載這一過程。代碼簡單易懂,效果非常好,需要的一起學(xué)習(xí)學(xué)習(xí)吧2015-09-09微信js-sdk預(yù)覽圖片接口及從拍照或手機(jī)相冊中選圖接口用法示例
這篇文章主要介紹了微信js-sdk預(yù)覽圖片接口及從拍照或手機(jī)相冊中選圖接口用法,較為詳細(xì)的分析了預(yù)覽圖片接口及與拍照或手機(jī)相冊中選圖接口的功能、調(diào)用方法與相關(guān)使用技巧,需要的朋友可以參考下2016-10-10