摘要:首先我們先說(shuō)一下這個(gè)函數(shù)的作用,這個(gè)函數(shù)接收一個(gè)數(shù)組作為參數(shù)然后將數(shù)組中所有通過(guò)布爾轉(zhuǎn)換可以變?yōu)榈闹等コ龔亩梢粋€(gè)新的數(shù)組。
原文首發(fā)于Lodash源碼講解
這是我們閱讀Lodash源碼的第3篇博客,在這篇文章里我們來(lái)學(xué)習(xí)一下Lodash的compact方法。
compact函數(shù)內(nèi)部沒(méi)有依賴(lài)別的函數(shù),讓我們先來(lái)看一下compact函數(shù)的源碼。
/** * Creates an array with all falsey values removed. The values `false`, `null`, * `0`, `""`, `undefined`, and `NaN` are falsey. * * @since 0.1.0 * @category Array * @param {Array} array The array to compact. * @returns {Array} Returns the new array of filtered values. * @example * * compact([0, 1, false, 2, "", 3]) * // => [1, 2, 3] */ function compact(array) { let resIndex = 0 const result = [] if (array == null) { return result } for (const value of array) { if (value) { result[resIndex++] = value } } return result } export default compact
首先我們先說(shuō)一下這個(gè)函數(shù)的作用,這個(gè)函數(shù)接收一個(gè)數(shù)組作為參數(shù);然后將數(shù)組中所有通過(guò)布爾轉(zhuǎn)換可以變?yōu)?b>false的值去除;從而生成一個(gè)新的數(shù)組。
那么那些值通過(guò)布爾轉(zhuǎn)換會(huì)變?yōu)?b>false呢;這些值有:0,"",false,null,undefined,NaN。
因?yàn)檫@個(gè)函數(shù)比較簡(jiǎn)單,我們就不劃分步驟了,直接進(jìn)行講解;首先我們初始化了兩個(gè)變量,resIndex用來(lái)表示我們返回的數(shù)組的索引;result是我們新創(chuàng)建的一個(gè)數(shù)組,這個(gè)數(shù)組就是我們要返回的數(shù)組;接下來(lái),如果傳遞的數(shù)組為空,我們直接返回一個(gè)空的數(shù)組;接下來(lái)就是使用ES6新的語(yǔ)法,for...of對(duì)傳遞的數(shù)組進(jìn)行循環(huán),將能夠通過(guò)布爾轉(zhuǎn)化為false的值去除,然后就獲取到了我們想要的結(jié)果。
那么,接下來(lái)我們首先把這個(gè)源碼部分實(shí)現(xiàn)一遍;雖然簡(jiǎn)單,但是還是要自己敲一遍代碼的;切記不要眼高手低。compact是我自己又重新實(shí)現(xiàn)一遍的代碼。
接下來(lái)我們考慮一下,如果我們不使用for...of來(lái)循環(huán)數(shù)組,而是使用數(shù)組的map方法,或者是使用while進(jìn)行數(shù)組的循環(huán);它們的效率有多大的差異?讓我們來(lái)實(shí)踐一下,首先是使用map方法,我們使用如下的代碼來(lái)進(jìn)行測(cè)試:
// 使用數(shù)組原生的map方法 function compact(array) { // 判斷array是否為空 if(array == null) { return []; } let result = []; array.map((value) => { if(value) { result.push(value); } }); return result; }
再接著我們使用while進(jìn)行數(shù)組的循環(huán),使用如下的代碼進(jìn)行測(cè)試:
// 使用while進(jìn)行數(shù)組的循環(huán) function compact(array) { // 判斷array是否為空 if(array == null) { return []; } let result = []; let index = 0; let resIndex = 0; let value; const length = array.length; while(index < length) { value = array[index]; if(value) { result[resIndex++] = value; } index++; } return result; }
我將這兩個(gè)方法都添加到之前的那個(gè)例子中了,大家可以點(diǎn)擊這里查看。
接下來(lái)我們就要進(jìn)行性能的測(cè)試了,我寫(xiě)了一個(gè)測(cè)試的用例;大家可以點(diǎn)擊這里查看。經(jīng)過(guò)多次測(cè)試發(fā)現(xiàn),使用lodash的compact方法和使用while進(jìn)行數(shù)組循環(huán)的compact方法的性能都還是不錯(cuò)的,使用map進(jìn)行數(shù)組循環(huán)的compact方法性能最差;但是使用map方法的compact方法代碼量是比較少的。
性能比較的圖如下圖所示:
lodash的compact方法性能比較好的一次測(cè)試:
使用while進(jìn)行數(shù)組循環(huán)的compact方法性能比較好的一次測(cè)試:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87388.html
摘要:到這里,源碼分析完了。但是,有兩個(gè)致命的特性的遍歷不能保證順序會(huì)遍歷所有可枚舉屬性,包括繼承的屬性。的遍歷順序依賴(lài)于執(zhí)行環(huán)境,不同執(zhí)行環(huán)境的實(shí)現(xiàn)方式可能會(huì)不一樣。 小時(shí)候,鄉(xiāng)愁是一枚小小的郵票, 我在這頭, 母親在那頭。 長(zhǎng)大后,鄉(xiāng)愁是一張窄窄的船票, 我在這頭, 新娘在那頭。 后來(lái)啊, 鄉(xiāng)愁是一方矮矮的墳?zāi)梗?我在外頭, 母親在里頭。 而現(xiàn)在, 鄉(xiāng)愁是一灣淺淺的海峽, 我在這頭, 大...
摘要:文檔地址中文文檔英文文檔源碼地址創(chuàng)建一個(gè)新數(shù)組,包含原數(shù)組中所有的非假值元素。例如和都是被認(rèn)為是假值。下面對(duì)比一下兩者效率,如下圖傳送門(mén)可以看到使用更快,如果沒(méi)有兼容性需求,還是使用原生函數(shù)比較好。 百忙之中(閑來(lái)無(wú)事)想抽點(diǎn)時(shí)間好好讀一下源碼,于是就選了Lodash來(lái)寫(xiě)一個(gè)系列罷。讀源碼順序就按照l(shuí)oadsh文檔順序來(lái)。 文檔地址:中文文檔?? 英文文檔源碼地址:gayhub ...
摘要:原文首發(fā)于源碼講解這是我們閱讀源碼的第篇博客,在這篇文章里我們來(lái)學(xué)習(xí)一下的方法。好啦,關(guān)于函數(shù)暫時(shí)就先講到這里啦。與惡龍纏斗過(guò)久自身亦成為惡龍凝視深淵過(guò)久深淵將回以凝視。 原文首發(fā)于Lodash源碼講解 這是我們閱讀Lodash源碼的第2篇博客,在這篇文章里我們來(lái)學(xué)習(xí)一下Lodash的chunk方法。 chunk函數(shù)內(nèi)部依賴(lài)其他的函數(shù),依賴(lài)的函數(shù)如下所示; slice 按照慣例,我們先...
摘要:本文首發(fā)于技術(shù)風(fēng)暴源碼講解這是我們閱讀源碼的第篇博客,這一篇博客主要介紹的函數(shù),這個(gè)函數(shù)內(nèi)部的實(shí)現(xiàn)沒(méi)有依賴(lài)別的函數(shù)我們這篇博客就來(lái)講解一下這個(gè)函數(shù)。 本文首發(fā)于技術(shù)風(fēng)暴-Lodash源碼講解 這是我們閱讀源碼的第1篇博客,這一篇博客主要介紹Lodash的slice函數(shù),這個(gè)函數(shù)內(nèi)部的實(shí)現(xiàn)沒(méi)有依賴(lài)別的函數(shù);我們這篇博客就來(lái)講解一下這個(gè)slice函數(shù)。 我們首先來(lái)看一下這個(gè)函數(shù)的源碼,源碼...
摘要:創(chuàng)建一個(gè)新數(shù)組,包含原數(shù)組中所有的非假值元素。例如和都是被認(rèn)為是假值。 創(chuàng)建一個(gè)新數(shù)組,包含原數(shù)組中所有的非假值元素。例如false, null, 0, , undefined, 和 NaN 都是被認(rèn)為是假值。 以下是自己實(shí)現(xiàn)的compact() compact:(array)=>{ let result = [] //判斷參數(shù)是否是數(shù)組 如果不是...
閱讀 1334·2021-09-01 11:40
閱讀 3941·2021-08-05 10:03
閱讀 974·2019-08-30 15:54
閱讀 2816·2019-08-29 12:53
閱讀 3179·2019-08-29 12:23
閱讀 940·2019-08-26 13:45
閱讀 2277·2019-08-26 10:41
閱讀 2535·2019-08-23 16:44