javascript
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) // -13.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即可)
? ? 第三個參數為想要添加進數組的元素
以上代碼的意思為:刪除索引為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数据结构与算法——数组详解(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eight Machine Learni
- 下一篇: gradle idea java ssm