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

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

定場詩 此處應該有掌聲... 前言 讀《學習JavaScript數據結構與演算法》 第3章 數組,本節將為各位小伙伴分享數組的相關知識:概念、創建方式、常見方法以及ES6數組的新功能。 數組 數組是最簡單的記憶體數據結構,用於存儲一系列同一種數據類型的值。 註:雖然數組支持存儲不同類型的值,但建議遵守最 ...


定場詩

大將生來膽氣豪,腰橫秋水雁翎刀。
風吹鼉鼓山河動,電閃旌旗日月高。
天上麒麟原有種,穴中螻蟻豈能逃。
太平待詔歸來日,朕與先生解戰袍。

此處應該有掌聲...

前言

讀《學習JavaScript數據結構與演算法》- 第3章 數組,本節將為各位小伙伴分享數組的相關知識:概念、創建方式、常見方法以及ES6數組的新功能。

數組

數組是最簡單的記憶體數據結構,用於存儲一系列同一種數據類型的值。

註:雖然數組支持存儲不同類型的值,但建議遵守最佳實踐。

一、數組基礎

創建和初始化數組

  1. new Array()

    // 空數組
    let heros = new Array()
    // 指定長度的數組 - 預設每個索引位置的值為undefined
    heros = new Array(7)
    // 直接將數組元素以參數的形式傳入數組構造器
    heros = new Array('鐘馗', '張良', '虞姬', '亞瑟', '荊軻')
  2. 字面量語法:[]

    let heros = ['魯班', '呂布', '王昭君', '蔡文姬', '孫悟空']

    推薦使用[]定義數組

數組索引

  • 數組的索引從0開始,依次累加;
  • 數組索引的最大值為數組的長度-1;
  • 每個數組的值都對應了一個數組的索引。

索引亦可稱之為下標或鍵

數組長度

數組的.length屬性可獲取元素的長度

let heros = ['魯班', '呂布', '王昭君', '蔡文姬', '孫悟空']
console.log('數組students的長度為:' + heros.length)

數組取值

使用 數組名[索引]的形式獲取數組的值

let heros = ['凱', '蘭陵王', '瑤', '雲中君', '典韋']
console.log('第一位英雄:' + heros[0]) // 凱

迭代數組

此處我們使用高大上的名詞迭代,拒絕低調的遍歷,不要問我為什麼!

數組的迭代我們可以選擇最簡單的迴圈結構

for (let i = 0; i < heros.length; i++) {
  console.log(heros[i])
}

常見面試題:斐波那契數列

斐波那契數列概念:第一項為1,第二項為1,從第三項開始,值為前兩項之和;
如 1, 1, 2, 3, 5, 8, 13 ...

// 求斐波那契數列前20個數
let fibonacci = []
fibonacci[0] = 1
fibonacci[1] = 1

for (let i = 2; i < 20; i++) {
  fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]
}

// 輸出
console.log(fibonacci)

二、數組元素操作

添加元素

數組尾部添加元素

  1. 將值賦值在數組的最後一個空位上的元素即可

    let heros = ['豬八戒', '嫦娥', '孫策']
    heros[heros.length] = ['蘇烈']
  2. 使用push方法

    heros.push('黃忠')
    console.log(heros) // [ '豬八戒', '嫦娥', '孫策', '黃忠' ]

數組開頭插入元素

  1. 自定義實現數組開頭插入元素的方法

    實現邏輯思考:在數組的開頭插入一個元素,需要空出數組第一個元素的位置,將所有的元素都向右移動一位

    Array.prototype.insertFirstPosition = function (value) {
      for (let i = this.length; i >= 0; i--) {
        this[i] = this[i - 1]
      }
      this[0] = value
    }
    heros.insertFirstPosition('周瑜')
    console.log(heros) // [ '周瑜', '豬八戒', '嫦娥', '孫策', '黃忠' ]
  2. 使用unshift方法

    heros.unshift('元歌')

    此方法背後的邏輯和insertFirstPosition方法的行為是一樣的。

    常見面試問題:

    思考:如果有一個存儲了大量數據的數組,在執行插入操作時,將值插入到指定的位置會發生什麼情況?

    答:從當前插入值的位置開始,後面所有數組元素都要向右移動一位。

    追問:性能會好嗎?

    答:肯定是不好的! 如包含1000個元素的數組,在數組索引0位置插入一個元素,需要移動1000個元素,性能肯定不好

    追問:如何優化呢?

    答:採用JS的鏈表結構 --- 啥是鏈表結構呢,請看持續關註公眾號文中呦...

刪除元素

數組尾部刪除元素

heros.pop()

數組開頭刪除元素

heros.shift()

在任意位置添加或刪除元素 -- splice

// array.splice(index[, number][, newValue1][, newValue2...])
// 從指定索引位置開始,執行刪除相應數量的元素,並添加執行的元素
let heros = ['周瑜', '豬八戒', '嫦娥', '孫策', '黃忠']
heros.splice(2, 1, '孫悟空')
console.log(heros) //  [ '周瑜', '豬八戒', '孫悟空', '孫策', '黃忠' ]

二維數組與多維數組

// 二維數組
let heros = [
  ['甄姬', '女媧', '安琪拉', '貂蟬'],
  ['典韋', '亞瑟', '曹操', '夏侯惇']
]

// 二維數組取值
console.log(heros[0][1]) // 女媧

// 多維數組
heros = [
  [
    ['甄姬', '安琪拉']
  ],
  [
    ['操作', '夏侯惇']
  ]
]
// 多維數組取值
console.log(heros[0][0][1]) // 安琪拉

無論是幾維的數組,只要按照索引去取值就好

三、數組常見方法

在JS中,數組是改進過的對象。這意味著創建的每一個數組都有一些可用的方法。

核心方法一覽表

方法 描述
concat 連接2個或多個數組,返回結果
every 對數組中的每個元素運行給定函數,如果該函數對每個元素都返回true,則返回true
filter 對數組中的每個元素運行給定函數,返回該函數會返回true的元素組成的數組
forEach 對數組中的每個元素運行給定函數,這個方法沒有返回值
join 將所有的數組元素連接成一個字元串
indexOf 返回第一個與給定參數相等的數組元素的索引,沒有找到返回-1
lastIndexOf 返回數組中搜索到的與給定參數相等的元素的索引里最大的值
map 對數組中的每個元素運行給定函數,返回每次函數調用的結果組成的數組
reverse 顛倒數組中元素的順序,反轉
reduce 接收一個函數作為累加器,返回一個最終計算的值
slice 傳入索引值,將數組裡對應索引範圍內的元素作為新數組返回
some 對數組中的每個元素運行給定函數,如果任意元素返回true,則返回true
sort 按照字母順序進行排序,支持傳入指定排序方法的函數作為參數
toString 將數組作為字元串返回
valueOf 和toString類似,將數組作為字元串返回

數組合併

concat方法可以向一個數組傳遞數組、對象或元素,數組會按照該方法傳入的參數順序連接指定的數組

let hz = '黃忠'
let partOfHeros = ['孫悟空', '孫斌', '李白']
let heros = ['鐘馗']
let herosList = heros.concat(hz, partOfHeros)
console.log(heroList) // [ '鐘馗', '黃忠', '孫悟空', '孫斌', '李白' ]

迭代器函數

一定要說迭代,不要說遍歷,不要問我為什麼!

every

every會迭代數組中的每個元素,直到返回false

// 判斷數組中是否全部是偶數
let arr = [1, 2, 3, 4]
let res = arr.every(v => v % 2 === 0)
conso.e.log(res) // false

some

some會迭代數組中的每個元素,直到返回true

// 判斷數組中是否有偶數
let arr = [1, 2, 3]
let res = arr.some(v => v % 2 === 0)
console.log(res) // true

forEach

迭代數組每一個元素

let arr = ['張良', '姜子牙', '露娜', '凱']

map

map會迭代數組的每個元素,對每個元素運行給定的方法,返回每次的結果

// 計算數組元素的乘方結果
let arr = [1, 2, 3]
let newArr = arr.map(v => v ** 2)
console.log(newArr) // [ 1, 4, 9 ]

filter

filter會迭代數組的每個元素,對每個元素運行給定的方法,返回的新數組由返回true的元素組成

// 返回數組中所有的女性英雄
let heros = [
  {
    name: '甄姬',
    sex: '女'
  },
  {
    name: '亞瑟',
    sex: '男'
  },
  {
    name: '貂蟬',
    sex: '女'
  }
]
let nvHeros = heros.filter(hero => hero.sex === '女')
console.log(nvHeros) // [ { name: '甄姬', sex: '女' }, { name: '貂蟬', sex: '女' } ]

reduce

接收一個函數作為累加器,最後返回一個計算的值

// 計算數組元素的和
let arr = [1, 2, 3, 4, 5, 6]
let sum = arr.reduce((previous, current) => previous + current)
console.log(sum) // 21

常見面試題-反轉字元串

如字元串 abcdef 輸出為 fedcba

  1. 使用for迴圈倒序拼接

    let str = 'abcdef'
    let newStr = ''
    for (let i = str.length - 1; i >= 0; i--) {
      newStr += str[i]
    }
    console.log(newStr) // fedcba
  2. 藉助數組函數reversejoin與字元串函數split

    let str = 'abcdef'
    let newStr = str.split('').reverse().join('')
    console.log(newStr) // fedcba

    後記

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

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

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

胡哥有話說


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

-Advertisement-
Play Games
更多相關文章
  • Javascript 有一個 main thread 主線程和 call-stack 調用棧(執行棧),所有的任務都會被放到調用棧等待主線程執行。 JS調用棧採用的是後進先出的規則,當函數執行的時候,會被添加到棧的頂部,當執行棧執行完成後,就會從棧頂移出,直到棧內被清空。 Javascript單線程 ...
  • 一、CSS顯示模式​ 1.在HTML中HTML將所有的標簽分為兩類,分別是容器類和文本級。在CSS中CSS也將所有的標簽分為兩類,分別是塊級元素和行內元素 2.什麼是塊級元素呢?什麼是行內元素​? (1)塊級元素會獨占一行 (2)行內元素不會獨占一行 3.塊級元素 p div h ul ol dl ...
  • 作為一個致力於前端開發的人員,能夠熟練掌握javascript的原理和機制是每個小白的必經之路,這也是最痛苦的。有人說前端功力好不好最主要的就是看對js的掌握能力,有人說十年也啃不完一門javascript。而我們能夠知道的是:javascript是每個前端學習的核心技能(想想之後的node.js、 ...
  • 今天,一個技術群里小朋友提出一個問題: 我默念心中的萬能公式,答案一下就出來了: a; 報錯(f.b is not a function); a; b; 這下子出題人產生了疑惑,你是控制台敲出來的吧! 但其實,原型鏈真的很簡單。話不多說,開始表演! 首先,我們簡單介紹一下,實例化一個對象(new)到 ...
  • 示例代碼托管在: "http://www.github.com/dashnowords/blogs" 博客園地址: "《大史住在大前端》原創博文目錄" 華為雲社區地址: "【你要的前端打怪升級指南】" [TOC] 分享一篇尤大大演講鎮樓: "「2019 JSConf.Asia 尤雨溪」在框架設計中尋 ...
  • 在web項目中經常會遇到線上瀏覽word文檔,通常解決方法將word轉換成pdf,然後線上瀏覽,但是在實際實現過程中,由於閱讀器的原因,用戶可以直接下載該pdf,這顯然不是我們想要的,通過網路搜索,發現可以將word文檔轉換成swf文件,通過flash實現線上瀏覽,本文將詳細介紹具體實現的方法。 ...
  • vuejs的極大程度的幫助減少了對dom的操作,他主要通過添加ref屬性,但是當獲取this.$refs屬性時,稍有不註意就會輸出undefined導致我們對dom節點的操作報錯。 this.$refs.xxx為undefined的幾種情況記錄: 1、在created里鉤子函數中調用 原因:crea ...
  • 避免內聯和嵌入代碼,儘量引入外部文件 樣式在上,腳本在下,樣式在head內 上線前通過自動化工具壓縮樣式表,或適應預處理器,如less,sass,stylus 儘量合併多個CSS文件,因為瀏覽器的並行下載速度有限 使用async非同步載入頁面內容,如使用多個屬性,並無固定順序 第三方插件應該非同步載入 ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...