Underscore源碼閱讀:flatten

flatten

flatten是用來實(shí)現(xiàn)數(shù)組扁平化的棚亩,并加入了shallow函數(shù)strict來表示是否只將數(shù)組進(jìn)行一次扁平化和是否對(duì)參數(shù)有嚴(yán)格要求。

然而我覺得官方的實(shí)現(xiàn)在效率上是有問題的。忽略shallowstrict,單看flatten本身的實(shí)現(xiàn)。

var flatten = function (input, shallow, strict, startIndex) {
  var output = [],
    idx = 0;
  for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
    var value = input[i];
    if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
      //flatten current level of array or arguments object
      if (!shallow) value = flatten(value, shallow, strict);
      var j = 0,
        len = value.length;
      output.length += len;
      while (j < len) {
        output[idx++] = value[j++];
      }
    } else if (!strict) {
      output[idx++] = value;
    }
  }
  return output;
};

underscore源碼的實(shí)現(xiàn)中狞贱,對(duì)于嵌套數(shù)組中的元素,會(huì)進(jìn)入下一層flatten函數(shù)調(diào)用蜀涨;在這層調(diào)用中瞎嬉,所有數(shù)組會(huì)被推入output并返回上一層(output[idx++] = value;);返回上一層后厚柳,又會(huì)遍歷一遍這個(gè)數(shù)組(while (j < len) output[idx++] = value[j++])氧枣。

也就是說,這相當(dāng)于將嵌套數(shù)組中的元素遍歷了兩遍别垮。

然而這種遍歷兩次并不是不能避免的便监。

// 忽略startIndex的實(shí)現(xiàn)
var flatten = function (input, shallow) {
  var res = [];
  (function fn(res, array, deep) {
    array.forEach(item => {
      if (isArrayLike(item) && (_.isArray(item) || _.isArguments(item))) {
        if (shallow && deep) {
          res.push(item);
        } else {
          fn(res, item, true);
        }
      } else {
        res.push(item);
      }
    });
  })(res, input, false);
  return res;
}

我們將最終返回結(jié)果的引用res在整個(gè)flatten調(diào)用棧中都調(diào)用,凡是遇見非數(shù)組元素碳想,就將這個(gè)元素pushres中烧董;遇到數(shù)組,也只是進(jìn)入下一層調(diào)用中胧奔,將所有非數(shù)組元素推進(jìn)去逊移。這樣就可以避免非數(shù)組元素被遍歷兩次了。

2018.11.27更新:
Underscore源碼沒有問題……今早睡醒突然在想flatten函數(shù)葡盗,發(fā)現(xiàn)我的遍歷是不能滿足strict參數(shù)的……源碼應(yīng)該是為了滿足strict參數(shù)所以才遍歷了兩遍螟左,沒毛病啡浊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末觅够,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巷嚣,更是在濱河造成了極大的恐慌喘先,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廷粒,死亡現(xiàn)場(chǎng)離奇詭異窘拯,居然都是意外死亡红且,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門涤姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暇番,“玉大人,你說我怎么就攤上這事思喊”诔辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵恨课,是天一觀的道長(zhǎng)舆乔。 經(jīng)常有香客問我,道長(zhǎng)剂公,這世上最難降的妖魔是什么希俩? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮纲辽,結(jié)果婚禮上颜武,老公的妹妹穿的比我還像新娘。我一直安慰自己拖吼,他們只是感情好盒刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绿贞,像睡著了一般因块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上籍铁,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天涡上,我揣著相機(jī)與錄音,去河邊找鬼拒名。 笑死吩愧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的增显。 我是一名探鬼主播雁佳,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼同云!你這毒婦竟也來了糖权?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤炸站,失蹤者是張志新(化名)和其女友劉穎星澳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱易,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禁偎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年腿堤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如暖。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笆檀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒至,到底是詐尸還是另有隱情误债,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布妄迁,位于F島的核電站寝蹈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏登淘。R本人自食惡果不足惜箫老,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黔州。 院中可真熱鬧耍鬓,春花似錦、人聲如沸流妻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绅这。三九已至涣达,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間证薇,已是汗流浹背度苔。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑度,地道東北人寇窑。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箩张,于是被迫代替她去往敵國和親甩骏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評(píng)論 0 3
  • Javascript有很多數(shù)組的方法先慷,有的人有W3C的API饮笛,還可以去MDN上去找,但是我覺得API上說的不全熟掂,M...
    頑皮的雪狐七七閱讀 4,095評(píng)論 0 6
  • 感謝社區(qū)中各位的大力支持缎浇,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券扎拣,享受所有官網(wǎng)優(yōu)惠赴肚,并抽取幸運(yùn)大獎(jiǎng):點(diǎn)擊這里領(lǐng)取 你...
    HetfieldJoe閱讀 745評(píng)論 0 2
  • 我一生只見過兩次小王子素跺,第一次是在成都九眼橋。 那天凌晨五點(diǎn)誉券,我在外面散步指厌。街上沒人,太陽也還沒出來踊跟,北極星清晰可...
    韋躍閱讀 609評(píng)論 1 48
  • / 生活/ 我所期望的生活是自洽的踩验,完美的邏輯和因果,有一些掙扎商玫,但不偏離箕憾,沒有沉溺夢(mèng)境的需求,也沒有...
    高微博閱讀 230評(píng)論 0 0