欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何實(shí)現(xiàn)JavaScript的Map和Filter函數(shù)?-創(chuàng)新互聯(lián)

譯者按: 魯迅曾經(jīng)說(shuō)過(guò),學(xué)習(xí)JavaScript最好方式莫過(guò)于敲代碼了!

成都創(chuàng)新互聯(lián)公司-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、綿陽(yáng)服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級(jí)互聯(lián)網(wǎng)基礎(chǔ)服務(wù),歡迎來(lái)電:18982081108
  • 原文: Master Map & Filter, Javascript’s Most Powerful Array Functions

  • 譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。

這篇文章面向那些已經(jīng)熟練使用for循環(huán),但對(duì)Array.mapArray.filter并沒(méi)有特別理解的開發(fā)者。本文將會(huì)手把手去實(shí)現(xiàn)這兩個(gè)函數(shù),來(lái)深入理解它們的工作原理。

Array.map

Array.map通過(guò)對(duì)輸入的數(shù)組中每一個(gè)元素進(jìn)行變換,返回由變換后的元素按序組成的新數(shù)組。原始數(shù)組的值不會(huì)被修改。假設(shè)我們相對(duì)一個(gè)數(shù)組中的每一個(gè)元素乘以3,使用for循環(huán)可以這樣寫。

for循環(huán)

var originalArr = [1, 2, 3, 4, 5];
var newArr = [];
for(var i = 0; i < originalArr.length; i++) {
    newArr[i] = originalArr[i] * 3;
}
console.log(newArr); // -> [3, 6, 9, 12, 15]

接下來(lái)我們將這個(gè)for循環(huán)抽象成一個(gè)函數(shù)。

multiplyByThree函數(shù)

var originalArr = [1, 2, 3, 4, 5];
function multiplyByThree(arr) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = arr[i] * 3;
    }
    return newArr;
}
var arrTransformed = multiplyByThree(originalArr);
console.log(arrTransformed); // -> [3, 6, 9, 12, 15]

現(xiàn)在我們繼續(xù)深化這個(gè)抽象思路,將multiplyByThree中對(duì)每一個(gè)元素乘以3部分抽象為一個(gè)新的函數(shù)。

var originalArr = [1, 2, 3, 4, 5];
function timesThree(item) {
    return item * 3;
}
function multiplyByThree(arr) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = timesThree(arr[i]);
    }
    return newArr;
}
var arrTransformed = multiplyByThree(originalArr);
console.log(arrTransformed); // -> [3, 6, 9, 12, 15]

這樣有什么好處呢?設(shè)想如果我們想對(duì)每一個(gè)元素乘以5,或則10,我們還要把整個(gè)for循環(huán)寫一遍嗎!
如果我們對(duì)timesThree函數(shù)稍作修改,就可以輕松的復(fù)用很多代碼。

multiply函數(shù)

我們將:

function multiplyByThree(arr) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = timesThree(arr[i]);
    }
    return newArr;
}

重構(gòu)為:

function multiply(arr, multiplyFunction) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = multiplyFunction(arr[i]);
    }
    return newArr;
}

我們將multiplyByThree重命名為multiply,并增加了一個(gè)參數(shù)。該參數(shù)是一個(gè)函數(shù),定義了數(shù)組元素的變換規(guī)則。通過(guò)定義一個(gè)timesThree函數(shù)來(lái)達(dá)到實(shí)現(xiàn)對(duì)每一個(gè)數(shù)組元素乘以3的目的。

var originalArr = [1, 2, 3, 4, 5];
function timesThree(item) {
    return item * 3;
}
var arrTimesThree = multiply(originalArr, timesThree);
console.log(arrTimesThree); // -> [3, 6, 9, 12, 15]

有何優(yōu)點(diǎn)呢?我們可以很簡(jiǎn)單定義任何變換:

var originalArr = [1, 2, 3, 4, 5];
function timesFive(item) {
    return item * 5;
}
var arrTimesFive = multiply(originalArr, timesFive);
console.log(arrTimesFive); // -> [5, 10, 15, 20, 25]

Map

我們進(jìn)一步抽象:

function multiply(arr, multiplyFunction) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = multiplyFunction(arr[i]);
    }
    return newArr;
}

multiply改為map, multiplyFunction改為transform:

function map(arr, transform) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = transform(arr[i]);
    }
    return newArr;
}

我們可以將任何對(duì)單個(gè)元素操作的函數(shù)傳入map函數(shù)。比如,我們將所有字符都變換成大寫:

function makeUpperCase(str) {
   return str.toUpperCase();
}
var arr = ['abc', 'def', 'ghi'];
var ARR = map(arr, makeUpperCase);
console.log(ARR); // -> ['ABC', 'DEF, 'GHI']

Array.map

我們定義的map函數(shù)和原生的Array.map還是有區(qū)別的:數(shù)組不再需要作為第一個(gè)參數(shù)傳入,而是在點(diǎn)(.)的左側(cè)。如果使用我們定義的map函數(shù),如下:

function func(item) {
   return item * 3;
}
var arr = [1, 2, 3];
var newArr = map(arr, func);
console.log(newArr); // -> [3, 6, 9]

如果使用自帶的Array.map函數(shù),則如下所示:

function func(item) {
   return item * 3;
}
var arr = [1, 2, 3];
var newArr = arr.map(func);
console.log(newArr); // -> [3, 6, 9]

Arrary.map參數(shù)解析

除了變換函數(shù)外,Array.map還可以接收其它兩個(gè)參數(shù): 數(shù)組索引(index), 原始的數(shù)組。

function logItem(item) {
    console.log(item);
}
function logAll(item, index, arr) {
    console.log(item, index, arr);
}
var arr = ['abc', 'def', 'ghi'];
arr.map(logItem); // -> 'abc', 'def', 'ghi'
arr.map(logAll); // -> 'abc', 0, ['abc', 'def', 'ghi']
                 // -> 'def', 1, ['abc', 'def', 'ghi']
                 // -> 'ghi', 2, ['abc', 'def', 'ghi']

因此,你可以再變換函數(shù)中使用索引和原始的數(shù)組。比如:你想要將一個(gè)列表變?yōu)閹蛱?hào)的列表,則需要使用索引(index)參數(shù):

function multiplyByIndex(item, index) {
    return (index + 1) + '. ' + item;
}
var arr = ['bananas', 'tomatoes', 'pasta', 'protein shakes'];
var mappedArr = arr.map(multiplyByIndex);
console.log(mappedArr); // ->
// ["1. bananas", "2. tomatoes", "3. pasta", "4. protein shakes"]

因此,我們自己實(shí)現(xiàn)的map函數(shù)也應(yīng)該支持這兩個(gè)參數(shù):

function map(arr, transform) {
    var newArr = [];

    for(var i = 0; i < arr.length; i++) {
        newArr[i] = transform(arr[i], i, arr);
    }
    return newArr;
}

當(dāng)然,Array.map函數(shù)還有一些錯(cuò)誤檢查和執(zhí)行優(yōu)化的代碼,我們定義的map只編碼了核心功能。

Array.filter

Array.filter將數(shù)組中不滿足條件的元素過(guò)濾,我們可以用for循環(huán)加上Array.push來(lái)實(shí)現(xiàn)。

for-loop

下面這段JS代碼將所有大于5的元素篩選出來(lái):

var arr = [2, 4, 6, 8, 10];
var filteredArr = [];
for(var i = 0; i < arr.length; i++) {
    if(arr[i] > 5) {
        filteredArr.push(arr[i]);
    }
}
console.log(filteredArr); // -> [6, 8, 10]

我們可以抽象這段代碼,定義為一個(gè)函數(shù):

function filterLessThanFive(arr) {
    var filteredArr = [];
    for(var i = 0; i < arr.length; i++) {
        if(arr[i] > 5){
            filteredArr.push(arr[i]);
        }
    }
    return filteredArr;
}
var arr1 = [2, 4, 6, 8, 10];
var arr1Filtered = filterLessThanFive(arr1);
console.log(arr1Filtered); // -> [6, 8, 10]

進(jìn)一步抽象,將過(guò)濾條件抽出來(lái):

function isGreaterThan5(item) {
    return item > 5;
}
function filterLessThanFive(arr) {
    var filteredArr = [];
    for(var i = 0; i < arr.length; i++) {
        if(isGreaterThan5(arr[i])) {
            filteredArr.push(arr[i]);
        }
    }
    return filteredArr;
}
var originalArr = [2, 4, 6, 8, 10];
var newArr = filterLessThanFive(originalArr);
console.log(newArr); // -> [6, 8, 10]

將過(guò)濾條件函數(shù)作為參數(shù)傳入:

function filterBelow(arr, greaterThan) {
    var filteredArr = [];
    for(var i = 0; i < arr.length; i++) {
        if(greaterThan(arr[i])) {
            filteredArr.push(arr[i]);
        }
    }
    return filteredArr;
}
var originalArr = [2, 4, 6, 8, 10];

大功告成!我們可以使用如下代碼來(lái)取出所有大于5的元素:

function isGreaterThan5(item) {
    return item > 5;
}
var newArr = filterBelow(originalArr, isGreaterThan5);
console.log(newArr); // -> [6, 8, 10];

Array.filter

我們將filterBelow重命名為filter, greaterThan重命名為testFunction:

function filter(arr, testFunction) {
    var filteredArr = [];
    for(var i = 0; i < arr.length; i++) {
        if(testFunction(arr[i])) {
            filteredArr.push(arr[i]);
        }
    }
    return filteredArr;
}

這就是一個(gè)基本的Array.filter函數(shù)了!

var arr = ['abc', 'def', 'ghijkl', 'mnopuv'];
function longerThanThree(str) {
    return str.length > 3;
}
var newArr1 = filter(arr, longerThanThree);
var newArr2 = arr.filter(longerThanThree);
console.log(newArr1); // -> ['ghijkl', 'mnopuv']
console.log(newArr2); // -> ['ghijkl', 'mnopuv']

同樣,Array.filter也有索引(index)和原始數(shù)組這兩個(gè)額外參數(shù)。

function func(item, index, arr) {
    console.log(item, index, arr);
}
var arr = ['abc', 'def', 'ghi'];
arr.filter(func); // -> 'abc', 0, ['abc', 'def', 'ghi']
                  // -> 'def', 1, ['abc', 'def', 'ghi']
                  // -> 'ghi', 2, ['abc', 'def', 'ghi']

關(guān)于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!

如何實(shí)現(xiàn)JavaScript的Map和Filter函數(shù)?

版權(quán)聲明

轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/26/master_map_filter_by_hand_written/

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文標(biāo)題:如何實(shí)現(xiàn)JavaScript的Map和Filter函數(shù)?-創(chuàng)新互聯(lián)
文章位置:http://aaarwkj.com/article12/dpipgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、標(biāo)簽優(yōu)化、ChatGPT網(wǎng)站收錄、品牌網(wǎng)站設(shè)計(jì)品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
丰满人妻被猛烈进入中文版| 色婷婷亚洲综合色一区二区| 欧美黄色一级在线免费观看| 日本一区二区免费高清不卡| 国产在线观看一区二区三区精品| 久久人妻蜜桃一区二区三区| 国产91精品系列在线观看| 好吊毛片一区二区三区| 日韩免费高清不卡视频| 国产一级黄色录像大片| 国产亚洲精品第一最新| 肥臀大屁股av在线播放| 福利福利视频一区二区| 中文字幕av二区三区人妻| 国产日韩在线不卡网站| 日本一区二区三区日本| 国产视频传媒一区二区| 午夜香蕉av一区二区三区| 日韩精品一区二区三区四区在线视频 | 男人天堂插插综合搜索| 欧美激情亚洲一区二区| 伊人久久精品一区二区| 国产黄片a三级久久久久久| 国产精品免费网站在线观看| 做性视频大全在线观看| 麻豆午夜福利在线播放| 亚洲精品一区二区三区高清| 亚洲精品熟女国产中文| 亚洲精品深夜福利视频| av网址不卡在线免费观看| 日韩av不卡免费播放| 国产一级二级三级大胆视频| 97人妻人人澡人人添人人爽| 日本丰满熟女毛茸茸的黑逼| 欧美日本国产老熟女视频| 亚洲男人天堂av电影| 国产高清在线不卡一区| 亚洲国产精品一区二区成人| 欧美乱与老熟妇视频观看| 亚洲精品偷拍在线观看| 婷婷激情亚洲综合综合久久|