亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

來(lái)一個(gè)老生常談的話題,Javascript 中,數(shù)組如何去重?

CocoaChina / 2870人閱讀

摘要:方法接受兩個(gè)參數(shù)第一個(gè)參數(shù)一個(gè)回調(diào)函數(shù),會(huì)將數(shù)據(jù)中的每一項(xiàng)都傳遞給該函數(shù),若該函數(shù)返回真值,則數(shù)據(jù)保存,返回假值,則數(shù)據(jù)將不會(huì)出現(xiàn)在新生成的數(shù)據(jù)中第二個(gè)參數(shù)回調(diào)函數(shù)中的指向我們將上面的去重方法按下面這樣重寫一下,就可以看清整個(gè)的執(zhí)行過(guò)程了。

關(guān)于如何去除一個(gè)給定數(shù)組中的重復(fù)項(xiàng),應(yīng)該是 Javascript 面試中最常見(jiàn)的一個(gè)問(wèn)題了,最常見(jiàn)的方式有三種:Set、Array.prototype.filter 以及 Array.prototype.reduce,對(duì)于只有簡(jiǎn)單數(shù)據(jù)的數(shù)組來(lái)講,我最喜歡 Set,沒(méi)別的,就是寫起來(lái)簡(jiǎn)單。

const originalArray = [1, 2, "咩", 1, "Super Ball", "咩", "咩", "Super Ball", 4]

const bySet = [...new Set(originalArray)]

const byFilter = originalArray.filter((item, index) => originalArray.indexOf(item) === index)

const byReduce = originalArray.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], [])
使用 Set

先讓我們來(lái)看看 Set 到底是個(gè)啥

Set 對(duì)象允許你存儲(chǔ)任何類型的唯一值,無(wú)論是原始值或者是對(duì)象引用。

https://developer.mozilla.org...

首先,Set 中只允許出現(xiàn)唯一值

唯一性是比對(duì)原始值或者對(duì)象引用

const bySet = [...new Set(originalArray)] 這一段的操作,我們將它拆分來(lái)看:

const originalArray = [1, 2, "咩", 1, "Super Ball", "咩", "咩", "Super Ball", 4]

const uniqueSet = new Set(originalArray)
// 得到 Set(5) [ 1, 2, "咩", "Super Ball", 4 ]

const bySet = [...uniqueSet]
// 得到 Array(5) [ 1, 2, "咩", "Super Ball", 4 ]

在將 Set 轉(zhuǎn)為 Array 時(shí),也可以使用 Array.from(set)。

使用 Array.prototype.filter

要理解 filter 方法為什么可以去重,需要關(guān)注一下另一個(gè)方法 indexOf

indexOf()方法返回在數(shù)組中可以找到一個(gè)給定元素的第一個(gè)索引,如果不存在,則返回 -1。

https://developer.mozilla.org...

const beasts = ["ant", "bison", "camel", "duck", "bison"];

console.log(beasts.indexOf("bison"));
// expected output: 1

// start from index 2
console.log(beasts.indexOf("bison", 2));
// expected output: 4

console.log(beasts.indexOf("giraffe"));
// expected output: -1
filter() 方法創(chuàng)建一個(gè)新數(shù)組, 其包含通過(guò)所提供函數(shù)實(shí)現(xiàn)的測(cè)試的所有元素。 

https://developer.mozilla.org...

filter 方法接受兩個(gè)參數(shù):

第一個(gè)參數(shù):一個(gè)回調(diào)函數(shù), filter 會(huì)將數(shù)據(jù)中的每一項(xiàng)都傳遞給該函數(shù),若該函數(shù)返回 真值,則數(shù)據(jù)保存,返回 假值,則數(shù)據(jù)將不會(huì)出現(xiàn)在新生成的數(shù)據(jù)中

第二個(gè)參數(shù):回調(diào)函數(shù)中 this 的指向

我們將上面的去重方法按下面這樣重寫一下,就可以看清整個(gè) filter 的執(zhí)行過(guò)程了。

const originalArray = [1, 2, "咩", 1, "Super Ball", "咩", "咩", "Super Ball", 4]

const table = []

const byFilter = originalArray.filter((item, index) => {
  // 如果找到的索引與當(dāng)前索引一致,則保留該值
  const shouldKeep = originalArray.indexOf(item) === index
  table.push({
    序號(hào): index,
    值: item,
    是否應(yīng)該保留: shouldKeep ? "保留" : "刪除"
  })
  return shouldKeep
})

console.log(byFilter)
console.table(table)
序號(hào) 是否應(yīng)該保留 -
0 1 保留 第一次出現(xiàn)
1 2 保留 第一次出現(xiàn)
2 保存 第一次出現(xiàn)
3 1 刪除 第二次出現(xiàn)
4 Super Ball 保留 第一次出現(xiàn)
5 刪除 第二次出現(xiàn)
6 刪除 第三次出現(xiàn)
7 Super Ball 刪除 第二次出現(xiàn)
8 4 保留 第一次出現(xiàn)
使用 Array.prototype.reduce
reduce() 方法對(duì)數(shù)組中的每個(gè)元素執(zhí)行一個(gè)由您提供的 reducer 函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個(gè)返回值。

https://developer.mozilla.org...

Array.prototype.reduce 方法接受兩個(gè)參數(shù):

Callback:回調(diào)函數(shù),它可以接收四個(gè)參數(shù)

Accumulator:累計(jì)器,這個(gè)其實(shí)是讓很多人忽略的一點(diǎn),就是,累計(jì)器其實(shí)可以是任何類型的數(shù)據(jù)

Current Value:當(dāng)前值

Current Index:當(dāng)前值的索引

Source Array:源數(shù)組

Initial Value:累計(jì)器的初始值,就跟累計(jì)器一樣,這個(gè)參數(shù)也總是被絕大多數(shù)人忽略

就像 filter 章節(jié)一樣,我們來(lái)看看 reduce 的執(zhí)行過(guò)程:

const originalArray = [1, 2, "咩", 1, "Super Ball", "咩", "咩", "Super Ball", 4]

const byReduce = originalArray.reduce((unique, item, index, source) => {
  const exist = unique.includes(item)
  const next = unique.includes(item) ? unique : [...unique, item]
  console.group(`遍歷第 ${index} 個(gè)值`)
  console.log("當(dāng)前累計(jì)器:", unique)
  console.log("當(dāng)前值:", item)
  console.log("是否已添加進(jìn)累計(jì)器?", exist)
  console.log("新值", next)
  console.groupEnd()
  return next
}, [])

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106882.html

相關(guān)文章

  • 案例 - 收藏集 - 掘金

    摘要:同行這么做使用實(shí)現(xiàn)圓形進(jìn)度條前端掘金在開(kāi)發(fā)微信小程序的時(shí)候,遇到圓形進(jìn)度條的需求。實(shí)現(xiàn)也談數(shù)組去重前端掘金的數(shù)組去重是一個(gè)老生常談的話題了。百度前端技術(shù)學(xué)院自定義前端掘金一標(biāo)簽概念元素表示用戶界面中項(xiàng)目的標(biāo)題。 閑話圖片上傳 - 掘金作者:孫輝,美團(tuán)金融前端團(tuán)隊(duì)成員。15年畢業(yè)加入美團(tuán),相信技術(shù),更相信技術(shù)只是大千世界里知識(shí)的一種,個(gè)人博客: https://sunyuhui.com ...

    張金寶 評(píng)論0 收藏0
  • 案例 - 收藏集 - 掘金

    摘要:同行這么做使用實(shí)現(xiàn)圓形進(jìn)度條前端掘金在開(kāi)發(fā)微信小程序的時(shí)候,遇到圓形進(jìn)度條的需求。實(shí)現(xiàn)也談數(shù)組去重前端掘金的數(shù)組去重是一個(gè)老生常談的話題了。百度前端技術(shù)學(xué)院自定義前端掘金一標(biāo)簽概念元素表示用戶界面中項(xiàng)目的標(biāo)題。 閑話圖片上傳 - 掘金作者:孫輝,美團(tuán)金融前端團(tuán)隊(duì)成員。15年畢業(yè)加入美團(tuán),相信技術(shù),更相信技術(shù)只是大千世界里知識(shí)的一種,個(gè)人博客: https://sunyuhui.com ...

    huangjinnan 評(píng)論0 收藏0
  • 三個(gè)嘆為觀止ES6 Array hack

    摘要:但是我其實(shí)一直以來(lái)不明白構(gòu)造函數(shù)的原型上,為什么沒(méi)有一個(gè)官方的方法,來(lái)產(chǎn)生一個(gè)不重復(fù)的數(shù)組或者完成數(shù)組去重的功能。我們使用展開(kāi)符,結(jié)合構(gòu)造函數(shù),便可以產(chǎn)生一個(gè)不含重復(fù)項(xiàng)的數(shù)組其實(shí),對(duì)數(shù)組去重的不同方法會(huì)產(chǎn)生不同影響。 在JavaScript中,數(shù)組隨處可見(jiàn)。在最新版本的ECMAScript 6背景下,借助新的展開(kāi)符、解構(gòu)等特性,我們可以對(duì)數(shù)組做很多四兩撥千斤的事情。 這片文章我會(huì)分享幾...

    hsluoyz 評(píng)論0 收藏0
  • 三個(gè)嘆為觀止ES6 Array hack

    摘要:但是我其實(shí)一直以來(lái)不明白構(gòu)造函數(shù)的原型上,為什么沒(méi)有一個(gè)官方的方法,來(lái)產(chǎn)生一個(gè)不重復(fù)的數(shù)組或者完成數(shù)組去重的功能。我們使用展開(kāi)符,結(jié)合構(gòu)造函數(shù),便可以產(chǎn)生一個(gè)不含重復(fù)項(xiàng)的數(shù)組其實(shí),對(duì)數(shù)組去重的不同方法會(huì)產(chǎn)生不同影響。 在JavaScript中,數(shù)組隨處可見(jiàn)。在最新版本的ECMAScript 6背景下,借助新的展開(kāi)符、解構(gòu)等特性,我們可以對(duì)數(shù)組做很多四兩撥千斤的事情。 這片文章我會(huì)分享幾...

    warmcheng 評(píng)論0 收藏0
  • 跟underscore一起學(xué)數(shù)組去重

    摘要:引子數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問(wèn)道。其中如果數(shù)組是排序的,去重運(yùn)算效率更高,因?yàn)榕判蚰軌驅(qū)⑾嗤臄?shù)排列在一起,方便前后比較。當(dāng)數(shù)組有序?qū)τ趯?duì)象的去重,我們知道為,所以使用比較對(duì)象在實(shí)際場(chǎng)景中沒(méi)有意義。 引子 數(shù)組去重是一個(gè)老生常談的話題,在面試中也經(jīng)常會(huì)被問(wèn)道。對(duì)于去重,有兩種主流思想: 先排序,線性遍歷后去重,時(shí)間復(fù)雜度O(n*log2n); 使用哈希,空間換...

    flybywind 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<