重讀《學習JavaScript數據結構與演算法-第三版》- 第3章 數組(二)

来源:https://www.cnblogs.com/justbecoder/archive/2019/08/16/11364218.html
-Advertisement-
Play Games

定場詩 前言 讀《學習JavaScript數據結構與演算法》 第3章 數組,本小節將繼續為各位小伙伴分享數組的相關知識:ES6數組的新功能。 一、ES6數組新功能 ES5和ES6數組新方法 |方法|描述| | | | |@@iterator|返回一個包含數組鍵值對的迭代器對象,可以通過同步調用得到數組 ...


定場詩

守法朝朝憂悶,強梁夜夜歡歌;
損人利己騎馬騾,正值公平挨餓;
修橋補路瞎眼,殺人放火兒多;
我到西天問我佛,佛說:我也沒轍!

前言

讀《學習JavaScript數據結構與演算法》- 第3章 數組,本小節將繼續為各位小伙伴分享數組的相關知識:ES6數組的新功能。

一、ES6數組新功能

ES5和ES6數組新方法

方法 描述
@@iterator 返回一個包含數組鍵值對的迭代器對象,可以通過同步調用得到數組元素的鍵值對
copyWithin 複製數組中一系列元素到同一數組指定的起始位置
entries 返回包含數組所有鍵值對的@@iterator
includes 如果數組中存在某個元素則返回true,否則返回false
find 根據回調函數給定的條件從數組中查找元素,如果找到返回該元素
findIndex 根據回調函數給定的條件從數組中查找元素,如果找到則返回該元素在數組中的索引
fill 用靜態值填充數組
from 根據已有數組創建一個新數組
keys 返回包含數組所有索引的@@iterator
of 根據傳入的參數創建新數組
value 返回包含數組所有值得@@iterator

除了以上新方法外,增加了for...of迴圈迭代數組以及從數組實例得到迭代器對象

for...of

迭代數組

let roles = ['宋江', '吳用', '盧俊義']
for (let v of roles) {
  console.log(v)
}

@@iterator

需要通過Symbol.iterator來訪問

let iterator = roles[Symbol.iterator]()
// .next()讀取一次,依次迭代即可; 當迭代結束時,iterator.next().value返回undefined
console.log(iterator.next().value)

// 迭代
for (let v of iterator) {
    console.log(v)
}

entries

返回包含鍵值對的@@iterator

let rolesEntries = roles.entries()
console.log(rolesEntries.next().value) // [ 0, '宋江' ]

for (v of rolesEntries) {
    console.log(v)
}

keys

返回包含數組索引的@@iterator

let rolesKeys = roles.keys()
console.log(rolesKeys)

for (v of rolesKeys) {
    console.log(v)
}

values

返回包含數組值的@@iterator

let rolesValues = roles.values()
console.log(rolesValues)

for (v of rolesValues) {
    console.log(v)
}

Array.from

根據已有數組創建新數組

let newRoles = Array.from(roles)
console.log(newRoles) // ['宋江', '吳用', '盧俊義']

Array.of

根據傳入的參數創建一個新數組

let roles = Array.of('宋江', '李順', '阮小七')
console.log(roles) // [ '宋江', '李順', '阮小七' ]

Array.fill

使用靜態值填充

let numbers = new Array(6)
numbers = Array.fill(1)
console.log(numbers) // [ 1, 1, 1, 1, 1, 1 ]

copyWithin

複製數組的一系列元素到同一數組指定的起始位置

let numbers = [1, 2, 3, 4, 5, 6]
// 將索引3到索引5位置之間的數據,複製到索引1位置
numbers.copyWithin(1, 3, 5)
console.log(numbers) // [ 1, 4, 5, 4, 5, 6 ]

數組排序

rerverse

反轉數組元素

let numbers = [1, 2, 3]
numbers.reverse()
console.log(numbers) // [ 3, 2, 1 ]

sort

按照字母順序對數組進行排序,支持傳入指定排序演算法的函數作為參數

let arr = ['a', 'b', 'd', 'c', 'f', 'e']
arr.sort()
console.log(arr) // [ 'a', 'b', 'c', 'd', 'e', 'f' ]

那麼問題來了!下麵的代碼console.log()輸出什麼?

let numbers = [1, 2, 3, 10, 11, 12, 13]
numbers.sort()
console.log(numbers) // ??? 思考10秒鐘.....

答案:[ 1, 10, 11, 12, 13, 2, 3 ] 手動疑問.gif

解析:sort()方法在進行數組元素排序時,把元素預設成字元串進行相互比較。

那如何解決實際問題,得到我們想要的結果呢?

let numbers = [1, 2, 3, 10, 11, 12, 13]
numbers.sort((a, b) => a - b)
console.log(numbers) // [ 1, 2, 3, 10, 11, 12, 13 ]

思考升級:字元串比較-大小寫比較

let users = ['Ana', 'ana', 'John', 'john']
users.sort()
console.log(users) // ???

答案:[ 'Ana', 'John', 'ana', 'john' ] 手動疑問.gif

解析:JS中做字元串比較時,根據字元對應的ASCII碼值來進行比較。A、J、a、j的ASCII碼對應的是:65、74、97、106

解決問題

let users = ['Ana', 'ana', 'John', 'john']
users.sort((a, b) => {
  if (a.toLocaleLowerCase() > b.toLocaleLowerCase()) {
    return 1
  }
  if (a.toLocaleLowerCase() < b.toLocaleLowerCase()) {
    return -1
  }
  return 0
})
console.log(users) // [ 'Ana', 'ana', 'John', 'john' ]

如果想要實現小寫字母排序在前,可使用localCompare方法
users.sort((a, b) => a.localeCompare(b))

實際業務場景:一系列數據排序:如按年齡、級別等

let users = [
  {
    name: '王二狗',
      age: 20
  },
  {
    name: '張三炮',
    age: 30
  },
  {
    name: '李四',
    age: 15
  }
]
users.sort((a, b) => a.age > b.age)
console.log(users) // [ { name: '李四', age: 15 }, { name: '王二狗', age: 20 }, { name: '張三炮', age: 30 } ]

數組搜索

ES5中為我們提供了indexOf()和lastIndexOf()方法查找元素,但是該二者方法只能查詢字元串數據,如查詢對象數組中的某個元素就力有不逮了。

業務場景: 購物車添加商品操作

當我們向購物車中添加一件商品時,要考慮該商品是否已經在購物車中存在了。

已存在,則購買數量+1;否則為新增購物車操作。

原先處理方式:遍歷購物車數組myCart,判斷待添加購物車商品tmpGoods的id和已有商品的id進行比對,若相同,則獲取當前元素索引,執行操作

擁抱ES6的新變化吧!- findIndex

// 已有購物車商品信息
let myCart = [
  {
    id: 1001,
    name: 'xxx-範冰冰版',
    num: 1
  },
  {
    id: 1002,
    name: 'xxx-志玲姐姐版',
    num: 2
  },
  {
    id: 1003,
    name: 'xxx-小嶽嶽版',
    num: 1
  }
]

// 待加入購物車的商品
let tmpGoods = {
  id: 1003,
  name: 'xxx-小嶽嶽版',
  num: 1
}

// 檢測該商品是否已經存在於購物車 
let index = myCart.findIndex(item => item.id === tmpGoods.id)
console.log(index)
if (index !== -1) {
  myCart[index].num += tmpGoods.num
} else {
  myCart.push(tmpGoods)
}
console.log(myCart)

findIndex 支持傳入指定的函數作為篩選條件,返回第一個匹配元素的索引位置,如果不存在則返回-1

find 支持傳入指定的函數作為條件,返回第一個匹配元素的值

ES7 - includes

includes 方法會根據條件查詢數組中是否有匹配元素,如果存在則返回true;否則返回false

let roles = ['諸葛亮', '荊軻', '虞姬', '亞瑟']
console.log(roles.includes('荊軻')) // true
console.log(roles.includes('哪吒')) // false

輸出數組為字元串

toString()和join()方法

toString

將數組所有元素輸出為字元串

let numbers = [1, 2, 3, 4]
console.log(numbers.toString()) // 1,2,3,4

join

將數組元素使用指定的字元進行拼接,預設使用,

let numbers = [1, 2, 3, 4]
console.log(numbers.join('-')) // 1-2-3-4

後記

以上就是胡哥今天給大家分享的內容,喜歡的小伙伴記得收藏轉發、點擊右下角按鈕在看,推薦給更多小伙伴呦,歡迎多多留言交流...

胡哥有話說,一個有技術,有情懷的胡哥!京東開放平臺首席前端攻城獅。與你一起聊聊大前端,分享前端系統架構,框架實現原理,最新最高效的技術實踐!

長按掃碼關註,更帥更漂亮呦!關註胡哥有話說公眾號,可與胡哥繼續深入交流呦!

胡哥有話說


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:https://blog.csdn.net/Jaden_hool/article/details/78437947 方法調用流程 調用一個方法是一個壓棧和出棧的過程,調用方法時將棧針壓入方法棧,然後執行方法體,方法結束時將棧針出棧,這個壓棧和出棧的過程會耗費資源,這個過程中傳遞形參也會耗費 ...
  • 多人開發時找回丟失的代碼 1.先保證所有分支的代碼都已經提交並拉取到最新狀態。 2.最重要的是需要找到最近一條自己代碼還存在的記錄,然後複製到最近的更早一條的提交記錄的id,比如e36e9e76da144536c196147b17335288da52c2ff;查找當前分支自己最新的一次提交記錄的id ...
  • CSS cascading(層疊) style(樣式) sheet(表) css註釋 引入方式 css選擇器 基本選擇器 元素選擇器 div{ } id選擇器 #demo 在html中(id="demo") 類選擇器 .demo 在html中(class="demo") 通用選擇器 *{ } 組合選 ...
  • 在之前,我寫了一個websql的封裝類庫,代碼如下: (function(win) { function smpWebSql(options){ options = options || {}; this.database = null; this.DateBaseName = options.Da ...
  • 08.16自我總結 django渲染高階 一.利用母版渲染 1.創建母版文件 如: 2.導入模板 二.一部分文件渲染 1.組件 2.導入組件 :這裡導入多個相同的內容會出現多個內容 三.函數渲染 1.內置函數渲染 使用方法: {{後臺傳輸的內容|內置函數}} 2.自定義函數渲染 1.在app中創建t ...
  • i標簽中的內容會以斜體顯示,b標簽中的內容會以加粗顯示 h5規範中規定,對於不需要著重的內容而是單純的加粗或者是斜體,就可以使用b和i標簽 在h5中使用small標簽來表示一些細則一類的內容 比如:合同中小字,網站的版權聲明都可以放到small 網頁中所有的加書名號的內容都可以使用cite標簽,表示 ...
  • strat javascript 的類型轉換一直是個大坑,但其實它也減少了代碼量。 ToPrimitive Symbol.toPrimitive 是一個內置的 Symbol 值,它作為對象的函數值屬性存在,當一個對象轉換為原始值時,會調用此函數。 該函數被調用時,會被傳遞一個字元串參數 ,表示要轉換 ...
  • 1、VUE構造器簡介 VUE構造器是一個非常重要的語法。 每個Vue.js應用都是通過構造函數Vue創建一個根實例。 New了Vue對象,然後調用了這個vue對象的構造器,並向構造器傳入了數據。 在實例化Vue時,需要傳入一個JSON對象,它可以包含數據、模板、掛在元素、方法、回調函數等選項,全部的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...