日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript数据结构与算法——数组详解(上)

發布時間:2023/12/31 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript数据结构与算法——数组详解(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、JS中的數組

? ? JS中的數組是一個特殊的對象,用來表示偏移量的索引是該對象的屬性,索引可能是整數,但是這些數字索引會在內部轉換成字符串類型(因為JS對象中的屬性名必須是字符串)。數組在JS中只是一種特殊的對象,效率不如其他語言中的數組高。

2、使用數組

? ? JS是一種靈活的語言,數組在JS中也是非常靈活的,接下來對數組的使用做一些總結。

2.1、創建數組

? ? 要使用數組,第一步就是創建,js中創建數組有哪些方法?

// 方法 ①var array = []// 方法 ②var array = [1, 2, 3, 4, 5]// 方法 ③var array = new Array()// 方法 ④var array = new Array(1, 2, 3, 4, 5)// 方法 ⑤var array = new Array(10)// 判斷是否是數組Array.isArray(param)

解釋:①與③均定義了一個空數組,③的方法是調用數組的構造函數創建數組。

????????②與④均定義了一個包含初始值的數組,④調用數組的構造函數,創建數組時傳入初始值。

????????⑤創建了一個長度為10的數組。

需要注意的是:調用數組的構造函數創建數組時,傳入的參數只有一個的話,指的是要創建的數組的長度。

此外,JavaScript數組中的元素不必是同一種數據類型,比如可以這樣定義:

var array = ["哈哈", 66, true, "hello"]

數組創建方法哪種好?大多數JS專家推薦使用[]操作符,和使用array的構造函數相比,這種方式被認為效率更高。

(此說法參見:《JavaScript:The Definitive Guide》)

2.2、讀寫數組

? 2.2.1、數組賦值
var array = []for (var i = 1; i <= 100; i++) {array[i-1] = i}

以上代碼將1-100分別賦值給了array[0]-array[99],我們可以測試一下:

console.log(array[0] + array[99])

相當于console.log(1 + 100),輸出會是101。

? 2.2.2、讀取數組

以上對array進行了賦值,我們可以使用for循環讀出數組中的每一項

var sum = 0for (var i = 0; i < array.length; i++) {sum += array[i]}console.log(sum)

運行結果為5050。

2.3、由字符串生成數組

????調用字符串對象的split()方法可以生成數組,該方法通過一些常見的分隔符,比如空格,將字符串分成幾部分,將每一個部分作為一個元素保存在數組中。比如:

var string = "I am a javaScript developer from guangzhou"var array = string.split(' ')console.log(array)

運行結果如下:


2.4、對數組的整體性操作

????有些操作是將數組作為一個整體進行的,也就是整體性操作。

?2.4.1、淺復制

????將一個數組直接賦值給另一個數組后,修改其中一個數組的值,會造成另一個數組中的值也發生改變,這種行為被稱為淺復制。因為數組是引用類型,新數組依然指向原數組,所以修改新數組會對原數組造成破壞,舉個例子。

var array1 = [1, 2, 3, 4, 5]var array2 = array1array2[0] = 100console.log(array1)

結果:


可見,將數組1直接賦值給數組2后,對數組2的修改會對數組1造成破壞。

?2.4.2、深復制

????深復制與淺復制相對,即深復制不會對原數組造成破壞,我們可以寫一個函數,將原數組的每一項進行讀取出來,再賦值給另一個數組,即可實現深復制。

// 深復制函數function deepCopy(newArray, oldArray) {for (var i = 0; i < oldArray.length; i ++) {newArray[i] = oldArray[i]}}var array1 = [1, 2, 3, 4, 5]var array2 = []// 調用深復制函數deepCopy(array2, array1)// 修改array2中的值array2[0] = 100// 測試是否會對array1造成破壞console.log(array1)

運行結果:


可見,修改了array2中的值,也不會對array1造成什么影響。

3、存取函數

????JavaScript提供了一組用來訪問數組元素的函數,叫做存取函數,這些函數返回目標數組的某種變體。

3.1、查找元素

?3.1.1、indexOf()

此函數是最常見的存取函數之一,用來查找傳進來的參數在數組中是否存在,如果存在則返回該元素在數組中的索引值,如果不存在則返回-1。

var array = ["C++", "JavaScript", "Java"]var a = array.indexOf('Java')var b = array.indexOf('Python')console.log(a) // 2console.log(b) // -1
3.1.2、lastIndexOf()

此函數返回相同元素最后一個索引,找不到的話返回-1,有興趣可以寫個例子測試一下。

3.2、數組的字符串表示

?3.2.1、join()

此函數用于將數組轉換成字符串,join()中可以傳入參數,比如join('-'),這樣以后,數組元素將被轉換成以-相連的字符串。

var array = ["C++", "JavaScript", "Java"]var string = array.join('-')console.log(string)

結果:


?3.2.2、toString()

跟join()一樣,用于將數組轉成字符串,區別是join()可以指定數組元素間連接的符號,而toString()會使用逗號相連。

3.3、由已有數組創建新數組

?3.3.1、concat()

此方法可以通過合并多個數組新建一個數組,舉個例子:

var array1 = ["C++", "JavaScript", "Java"]var array2 = ["Nodejs", "大學英語", "王者農藥"]var newArray = array1.concat(array2)console.log(newArray)

結果:


3.3.2、splice()

此方法可以通過截取某個數組的子集新建一個數組,舉個例子:

var array1 = ["Java", "Nodejs", "大學英語", "王者農藥"]// 只傳一個數字的話,代表從當前數字開始截到最后var newArray = array1.splice(0)// 傳兩個參數的話,第一個代表起始索引,第二個代表截取的長度var newArray1 = array1.splice(1, 2)console.log(newArray.toString())console.log(newArray1.toString())

為什么結果里newArray1.toString()是空數組???


解釋:因為array1.splice(0)把array1中的值都截取到了newArray中,雖然array1.splice(1, 2)的原意是截取array1中索引為1到2的元素,但此時array1中已經沒有元素,所以newArray1是一個空數組。

因此借助此方法,也可以對一個數組進行增加或移除元素操作。

4、可變函數

可變函數也可用于操作數組,與存取函數不同的是,可變函數不必引用數組中的某個元素,就能改變數組內容。這么神奇?讓我們探索探索。

4.1、為數組添加元素

4.1.1、push()

此方法可以將一個元素添加到數組結尾,并返回添加成功后數組的長度。比較簡單,直接在控制臺演示好了。


4.1.2、unshift()

此方法可以將一個元素添加到數組開頭,并返回添加成功后數組的長度。


4.2、從數組刪除元素

4.2.1、pop()

此方法可以刪除數組的最后一個元素,并返回被刪除的元素的值


4.2.2、shift()

此方法可以刪除數組的第一個元素,并返回被刪除的元素的值


4.3、從數組中間位置添加和刪除元素

4.3.1、再談splice()

使用splice()添加數組元素時,可以傳入三個參數:

????第一個參數為起始索引(要開始插入元素的地方,如果是0,則在0索引前開始插入)

? ? 第二個參數為需要刪除的元素個數,(不需要刪就直接加的話,設置為0即可)

? ? 第三個參數為想要添加進數組的元素

var array1 = ["Java", "Nodejs", "大學英語", "王者農藥"]array1.splice(1, 1, "哈哈哈")console.log(array1)

以上代碼的意思為:刪除索引為1的元素"Nodejs",并在索引1的元素前插入"哈哈哈",所以運行結果應該是

["Java", "哈哈哈", "大學英語", "王者農藥"]

使用splice()刪除數組元素在之前章節已經談到過,不過還是舉個例子加深一下:

var array1 = ["Java", "Nodejs", "大學英語", "王者農藥"]array1.splice(1, 1)console.log(array1)

解釋:刪除索引為1開始,之后的一個元素,也就是刪除了"Nodejs",每次受傷害的都是Nodejs。。。splice()不傳參數的話,全部都會刪除。


4.4、為數組排序

4.4.1、reverse()

此方法用于將數組的原始排序倒轉過來,舉個例子:

var array = ["Java", "Nodejs", "大學英語", "王者農藥"]array.reverse()console.log(array)

是的,得到的是:


4.4.2、sort()

此方法按照字典順序對元素進行排序,因此方法假定元素都是字符串類型(即使元素都是數字)。舉些例子:

var array = ["Java", "Nodejs", "English", "Algorithm"]array.sort()console.log(array)

執行結果為:


以上是元素是字符串的情況,假如元素是數字類型的話,直接調用sort()是不行的,比如:

var array = [1, 2, 200, 3, 400, 100]array.sort()console.log(array)

結果為:


顯然結果是不對的。怎么辦呢?傳入一個數字比較函數,比如升序的情況,數字兩兩對比,第一個比第二個大的話,調換位置即可,以下代碼為了簡便,我寫成了匿名函數,你也可以選擇抽出來:

var array = [1, 2, 200, 3, 400, 100]array.sort(function (a, b) {return a - b})console.log(array)


這樣以后,排序時就不會使用默認的字典排序。

篇幅似乎有點長了,剩余內容我們留到下篇再談~~總結可能會存在一些問題,有的話歡迎指出O(∩_∩)O~~

周末愉快!!!

總結

以上是生活随笔為你收集整理的JavaScript数据结构与算法——数组详解(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。