lodash源碼分析(sortIndex和union函數(shù))

sortIndex函數(shù)

我的實(shí)現(xiàn)

function sortIndex(array,value) {
    let len = array.length;
    let index = 0;



    while(index < len)  {
        if (value <= array[index]) {
            break
        }
        index++
    }

    return index
}

別人的實(shí)現(xiàn)

function baseSortedIndex(array, value) {
  let low = 0
  let high = array == null ? low : array.length

  if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
    while (low < high) {
      const mid = (low + high) >>> 1
      const computed = array[mid]
      if (computed !== null && !isSymbol(computed) && computed < value) {
        low = mid + 1
      } else {
        high = mid
      }
    }
    return high
  }
}

總結(jié)

  • 主要是算法比我的好搞隐,使用的二分查找法部脚,時(shí)間復(fù)雜度是logn,比我的快讨越。照理說唱凯,這種算法我應(yīng)該很熟的。當(dāng)時(shí)寫代碼時(shí)應(yīng)該想得到的谎痢。
  • 在算Math.floor((1+2) /2)時(shí),用了(1+2) >>>1 來計(jì)算卷雕。

sortUniq函數(shù)

我的實(shí)現(xiàn)

function sortedUniq(array) {
    let len = array.length;
    let result = [];

    let preVal
    for(let val of array) {
        if (val != preVal) {
            result.push(val);
            preVal = val
        }
    }

    return result
}

別人的實(shí)現(xiàn)

function eq(value, other) {
  return value === other || (value !== value && other !== other)
}
function baseSortedUniq(array, iteratee) {
  let seen
  let index = -1
  let resIndex = 0

  const { length } = array
  const result = []

  while (++index < length) {
    const value = array[index], computed = iteratee ? iteratee(value) : value
    if (!index || !eq(computed, seen)) {
      seen = computed
      result[resIndex++] = value === 0 ? 0 : value
    }
  }
  return result
}

我的總結(jié)

  • 算法是一致的节猿。因?yàn)樽⒁獾绞且呀?jīng)排序過的數(shù)組。所以沒有使用hash字典的算法來去重漫雕,雖然時(shí)間復(fù)雜度一致滨嘱,但是后者浪費(fèi)了空間
  • 唯一的區(qū)別是別人實(shí)現(xiàn)的eq函數(shù),這是一個(gè)嚴(yán)格判斷兩個(gè)變量是否相等的函數(shù)浸间,在這個(gè)eq函數(shù)中 1=== '1'是false)太雨,當(dāng)然代碼value !== value && other !== other是為了判斷eq(NaN, NaN)為true的。

union函數(shù)

我的實(shí)現(xiàn)

function union(...arrays) {
    let result = []
    let finalResult = []
    for (let val of arrays) {
        result = [...result, ...val]
    }


    //unique所有的數(shù)組
    let uniqueHashMap = {};
    for (let value of result) {
        debugger
        uniqueHashMap[value] = uniqueHashMap[value] ? (uniqueHashMap[value] + 1) : 1
    }

    console.log(uniqueHashMap)

    //循環(huán)uniqueHashMap 對象魁蒜,選取 uniqueHashMap[value]為1的數(shù)據(jù)
    console.log(Object.keys(uniqueHashMap))
    Object.keys(uniqueHashMap).forEach((val) => {
        finalResult.push(val)
    })

    return finalResult
}

別人的實(shí)現(xiàn)

function baseUniq(array, iteratee, comparator) {
  let index = -1
  let includes = arrayIncludes
  let isCommon = true

  const { length } = array
  const result = []
  let seen = result

  if (comparator) {
    isCommon = false
    includes = arrayIncludesWith
  }
  else if (length >= LARGE_ARRAY_SIZE) {
    const set = iteratee ? null : createSet(array)
    if (set) {
      return setToArray(set)
    }
    isCommon = false
    includes = cacheHas
    seen = new SetCache
  }
  else {
    seen = iteratee ? [] : result
  }
  outer:
  while (++index < length) {
    let value = array[index]
    const computed = iteratee ? iteratee(value) : value

    value = (comparator || value !== 0) ? value : 0
    if (isCommon && computed === computed) {
      let seenIndex = seen.length
      while (seenIndex--) {
        if (seen[seenIndex] === computed) {
          continue outer
        }
      }
      if (iteratee) {
        seen.push(computed)
      }
      result.push(value)
    }
    else if (!includes(seen, computed, comparator)) {
      if (seen !== result) {
        seen.push(computed)
      }
      result.push(value)
    }
  }
  return result
}

function union(...arrays) {
  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true))
}

總結(jié)

  • 算法都是一致的囊扳,先合并數(shù)組,然后數(shù)據(jù)去重兜看。只不過去重的方法不一樣锥咸。我采用的是hashmap的方式,當(dāng)時(shí)有一個(gè)問題 Object.keys(array)會(huì)將number類型轉(zhuǎn)化為string;lodash使用二層循環(huán)來去重细移,其他沒有什么差別
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搏予,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弧轧,更是在濱河造成了極大的恐慌雪侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件精绎,死亡現(xiàn)場離奇詭異速缨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捺典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鸟廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事引谜‰鼓埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵员咽,是天一觀的道長毒涧。 經(jīng)常有香客問我,道長贝室,這世上最難降的妖魔是什么契讲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滑频,結(jié)果婚禮上捡偏,老公的妹妹穿的比我還像新娘。我一直安慰自己峡迷,他們只是感情好银伟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绘搞,像睡著了一般彤避。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夯辖,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天琉预,我揣著相機(jī)與錄音,去河邊找鬼蒿褂。 笑死圆米,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贮缅。 我是一名探鬼主播榨咐,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谴供!你這毒婦竟也來了块茁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桂肌,失蹤者是張志新(化名)和其女友劉穎数焊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崎场,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佩耳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谭跨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片干厚。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡李滴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛮瞄,到底是詐尸還是另有隱情所坯,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布挂捅,位于F島的核電站芹助,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闲先。R本人自食惡果不足惜状土,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伺糠。 院中可真熱鬧蒙谓,春花似錦、人聲如沸训桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渊迁。三九已至,卻和暖如春灶挟,著一層夾襖步出監(jiān)牢的瞬間琉朽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工稚铣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箱叁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓惕医,卻偏偏與公主長得像耕漱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子抬伺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,797評論 0 38
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)螟够,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)峡钓。 注意:講述HT...
    kismetajun閱讀 27,486評論 1 45
  • 世間最難走的路是通往你的心頭 世間最難喝的酒是你眉間的愁 而我在這條路上醉了一宿又一宿
    Skr啊閱讀 324評論 2 1