javascript
JavaScript数据结构与算法——数组详解(上)
1、JS中的數(shù)組
? ? JS中的數(shù)組是一個特殊的對象,用來表示偏移量的索引是該對象的屬性,索引可能是整數(shù),但是這些數(shù)字索引會在內(nèi)部轉(zhuǎn)換成字符串類型(因?yàn)镴S對象中的屬性名必須是字符串)。數(shù)組在JS中只是一種特殊的對象,效率不如其他語言中的數(shù)組高。
2、使用數(shù)組
? ? JS是一種靈活的語言,數(shù)組在JS中也是非常靈活的,接下來對數(shù)組的使用做一些總結(jié)。
2.1、創(chuàng)建數(shù)組
? ? 要使用數(shù)組,第一步就是創(chuàng)建,js中創(chuàng)建數(shù)組有哪些方法?
// 方法 ①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)// 判斷是否是數(shù)組Array.isArray(param)解釋:①與③均定義了一個空數(shù)組,③的方法是調(diào)用數(shù)組的構(gòu)造函數(shù)創(chuàng)建數(shù)組。
????????②與④均定義了一個包含初始值的數(shù)組,④調(diào)用數(shù)組的構(gòu)造函數(shù),創(chuàng)建數(shù)組時傳入初始值。
????????⑤創(chuàng)建了一個長度為10的數(shù)組。
需要注意的是:調(diào)用數(shù)組的構(gòu)造函數(shù)創(chuàng)建數(shù)組時,傳入的參數(shù)只有一個的話,指的是要創(chuàng)建的數(shù)組的長度。
此外,JavaScript數(shù)組中的元素不必是同一種數(shù)據(jù)類型,比如可以這樣定義:
var array = ["哈哈", 66, true, "hello"]數(shù)組創(chuàng)建方法哪種好?大多數(shù)JS專家推薦使用[]操作符,和使用array的構(gòu)造函數(shù)相比,這種方式被認(rèn)為效率更高。
(此說法參見:《JavaScript:The Definitive Guide》)
2.2、讀寫數(shù)組
? 2.2.1、數(shù)組賦值
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])相當(dāng)于console.log(1 + 100),輸出會是101。
? 2.2.2、讀取數(shù)組
以上對array進(jìn)行了賦值,我們可以使用for循環(huán)讀出數(shù)組中的每一項(xiàng)
var sum = 0for (var i = 0; i < array.length; i++) {sum += array[i]}console.log(sum)運(yùn)行結(jié)果為5050。
2.3、由字符串生成數(shù)組
????調(diào)用字符串對象的split()方法可以生成數(shù)組,該方法通過一些常見的分隔符,比如空格,將字符串分成幾部分,將每一個部分作為一個元素保存在數(shù)組中。比如:
var string = "I am a javaScript developer from guangzhou"var array = string.split(' ')console.log(array)運(yùn)行結(jié)果如下:
2.4、對數(shù)組的整體性操作
????有些操作是將數(shù)組作為一個整體進(jìn)行的,也就是整體性操作。
?2.4.1、淺復(fù)制
????將一個數(shù)組直接賦值給另一個數(shù)組后,修改其中一個數(shù)組的值,會造成另一個數(shù)組中的值也發(fā)生改變,這種行為被稱為淺復(fù)制。因?yàn)閿?shù)組是引用類型,新數(shù)組依然指向原數(shù)組,所以修改新數(shù)組會對原數(shù)組造成破壞,舉個例子。
var array1 = [1, 2, 3, 4, 5]var array2 = array1array2[0] = 100console.log(array1)結(jié)果:
可見,將數(shù)組1直接賦值給數(shù)組2后,對數(shù)組2的修改會對數(shù)組1造成破壞。
?2.4.2、深復(fù)制
????深復(fù)制與淺復(fù)制相對,即深復(fù)制不會對原數(shù)組造成破壞,我們可以寫一個函數(shù),將原數(shù)組的每一項(xiàng)進(jìn)行讀取出來,再賦值給另一個數(shù)組,即可實(shí)現(xiàn)深復(fù)制。
// 深復(fù)制函數(shù)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 = []// 調(diào)用深復(fù)制函數(shù)deepCopy(array2, array1)// 修改array2中的值array2[0] = 100// 測試是否會對array1造成破壞console.log(array1)運(yùn)行結(jié)果:
可見,修改了array2中的值,也不會對array1造成什么影響。
3、存取函數(shù)
????JavaScript提供了一組用來訪問數(shù)組元素的函數(shù),叫做存取函數(shù),這些函數(shù)返回目標(biāo)數(shù)組的某種變體。
3.1、查找元素
?3.1.1、indexOf()
此函數(shù)是最常見的存取函數(shù)之一,用來查找傳進(jìn)來的參數(shù)在數(shù)組中是否存在,如果存在則返回該元素在數(shù)組中的索引值,如果不存在則返回-1。
var array = ["C++", "JavaScript", "Java"]var a = array.indexOf('Java')var b = array.indexOf('Python')console.log(a) // 2console.log(b) // -13.1.2、lastIndexOf()
此函數(shù)返回相同元素最后一個索引,找不到的話返回-1,有興趣可以寫個例子測試一下。
3.2、數(shù)組的字符串表示
?3.2.1、join()
此函數(shù)用于將數(shù)組轉(zhuǎn)換成字符串,join()中可以傳入?yún)?shù),比如join('-'),這樣以后,數(shù)組元素將被轉(zhuǎn)換成以-相連的字符串。
var array = ["C++", "JavaScript", "Java"]var string = array.join('-')console.log(string)結(jié)果:
?3.2.2、toString()
跟join()一樣,用于將數(shù)組轉(zhuǎn)成字符串,區(qū)別是join()可以指定數(shù)組元素間連接的符號,而toString()會使用逗號相連。
3.3、由已有數(shù)組創(chuàng)建新數(shù)組
?3.3.1、concat()
此方法可以通過合并多個數(shù)組新建一個數(shù)組,舉個例子:
var array1 = ["C++", "JavaScript", "Java"]var array2 = ["Nodejs", "大學(xué)英語", "王者農(nóng)藥"]var newArray = array1.concat(array2)console.log(newArray)結(jié)果:
3.3.2、splice()
此方法可以通過截取某個數(shù)組的子集新建一個數(shù)組,舉個例子:
var array1 = ["Java", "Nodejs", "大學(xué)英語", "王者農(nóng)藥"]// 只傳一個數(shù)字的話,代表從當(dāng)前數(shù)字開始截到最后var newArray = array1.splice(0)// 傳兩個參數(shù)的話,第一個代表起始索引,第二個代表截取的長度var newArray1 = array1.splice(1, 2)console.log(newArray.toString())console.log(newArray1.toString())為什么結(jié)果里newArray1.toString()是空數(shù)組???
解釋:因?yàn)閍rray1.splice(0)把a(bǔ)rray1中的值都截取到了newArray中,雖然array1.splice(1, 2)的原意是截取array1中索引為1到2的元素,但此時array1中已經(jīng)沒有元素,所以newArray1是一個空數(shù)組。
因此借助此方法,也可以對一個數(shù)組進(jìn)行增加或移除元素操作。
4、可變函數(shù)
可變函數(shù)也可用于操作數(shù)組,與存取函數(shù)不同的是,可變函數(shù)不必引用數(shù)組中的某個元素,就能改變數(shù)組內(nèi)容。這么神奇?讓我們探索探索。
4.1、為數(shù)組添加元素
4.1.1、push()
此方法可以將一個元素添加到數(shù)組結(jié)尾,并返回添加成功后數(shù)組的長度。比較簡單,直接在控制臺演示好了。
4.1.2、unshift()
此方法可以將一個元素添加到數(shù)組開頭,并返回添加成功后數(shù)組的長度。
4.2、從數(shù)組刪除元素
4.2.1、pop()
此方法可以刪除數(shù)組的最后一個元素,并返回被刪除的元素的值
4.2.2、shift()
此方法可以刪除數(shù)組的第一個元素,并返回被刪除的元素的值
4.3、從數(shù)組中間位置添加和刪除元素
4.3.1、再談splice()
使用splice()添加數(shù)組元素時,可以傳入三個參數(shù):
????第一個參數(shù)為起始索引(要開始插入元素的地方,如果是0,則在0索引前開始插入)
? ? 第二個參數(shù)為需要刪除的元素個數(shù),(不需要刪就直接加的話,設(shè)置為0即可)
? ? 第三個參數(shù)為想要添加進(jìn)數(shù)組的元素
以上代碼的意思為:刪除索引為1的元素"Nodejs",并在索引1的元素前插入"哈哈哈",所以運(yùn)行結(jié)果應(yīng)該是
["Java", "哈哈哈", "大學(xué)英語", "王者農(nóng)藥"]
使用splice()刪除數(shù)組元素在之前章節(jié)已經(jīng)談到過,不過還是舉個例子加深一下:
var array1 = ["Java", "Nodejs", "大學(xué)英語", "王者農(nóng)藥"]array1.splice(1, 1)console.log(array1)解釋:刪除索引為1開始,之后的一個元素,也就是刪除了"Nodejs",每次受傷害的都是Nodejs。。。splice()不傳參數(shù)的話,全部都會刪除。
4.4、為數(shù)組排序
4.4.1、reverse()
此方法用于將數(shù)組的原始排序倒轉(zhuǎn)過來,舉個例子:
var array = ["Java", "Nodejs", "大學(xué)英語", "王者農(nóng)藥"]array.reverse()console.log(array)是的,得到的是:
4.4.2、sort()
此方法按照字典順序?qū)υ剡M(jìn)行排序,因此方法假定元素都是字符串類型(即使元素都是數(shù)字)。舉些例子:
var array = ["Java", "Nodejs", "English", "Algorithm"]array.sort()console.log(array)執(zhí)行結(jié)果為:
以上是元素是字符串的情況,假如元素是數(shù)字類型的話,直接調(diào)用sort()是不行的,比如:
var array = [1, 2, 200, 3, 400, 100]array.sort()console.log(array)結(jié)果為:
顯然結(jié)果是不對的。怎么辦呢?傳入一個數(shù)字比較函數(shù),比如升序的情況,數(shù)字兩兩對比,第一個比第二個大的話,調(diào)換位置即可,以下代碼為了簡便,我寫成了匿名函數(shù),你也可以選擇抽出來:
var array = [1, 2, 200, 3, 400, 100]array.sort(function (a, b) {return a - b})console.log(array)這樣以后,排序時就不會使用默認(rèn)的字典排序。
篇幅似乎有點(diǎn)長了,剩余內(nèi)容我們留到下篇再談~~總結(jié)可能會存在一些問題,有的話歡迎指出O(∩_∩)O~~
周末愉快!!!
總結(jié)
以上是生活随笔為你收集整理的JavaScript数据结构与算法——数组详解(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eight Machine Learni
- 下一篇: take的过去式