JavaScript中建立數組有兩種方式
(一)使用 Array 構造函數:
(二)使用數組字面量表示法:
數組的方法有數組原型方法,也有從object對象繼承來的方法,這裡我們隻介紹數組的原型方法,數組原型方法主要有以下這些:
join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice()
splice()
indexOf()和 lastIndexOf() (ES5新增)
forEach() (ES5新增)
map() (ES5新增)
filter() (ES5新增)
every() (ES5新增)
some() (ES5新增)
reduce()和 reduceRight() (ES5新增)
下面詳細介紹一下各個方法的基本功能。
1、join()
join(separator): 将數組的元素組起一個字元串,以separator為分隔符,省略的話則用預設用逗号為分隔符,該方法隻接收一個參數:即分隔符。
1
2
3
4
<code>var</code> <code>arr = [1,2,3];</code>
<code>console.log(arr.join());</code><code>// 1,2,3</code>
<code>console.log(arr.join(</code><code>"-"</code><code>));</code><code>// 1-2-3</code>
<code>console.log(arr);</code><code>// [1, 2, 3](原數組不變)</code>
通過join()方法可以實作重複字元串,隻需傳入字元串以及重複的次數,就能傳回重複後的字元串,函數如下:
5
<code>function</code> <code>repeatString(str, n) {</code>
<code>return</code> <code>new</code> <code>Array(n + 1).join(str);</code>
<code>}</code>
<code>console.log(repeatString(</code><code>"abc"</code><code>, 3));</code><code>// abcabcabc</code>
<code>console.log(repeatString(</code><code>"Hi"</code><code>, 5));</code><code>// HiHiHiHiHi</code>
2、push()和pop()
push(): 可以接收任意數量的參數,把它們逐個添加到數組末尾,并傳回修改後數組的長度。
pop():數組末尾移除最後一項,減少數組的 length 值,然後傳回移除的項。
6
7
<code>var</code> <code>arr = [</code><code>"Lily"</code><code>,</code><code>"lucy"</code><code>,</code><code>"Tom"</code><code>];</code>
<code>var</code> <code>count = arr.push(</code><code>"Jack"</code><code>,</code><code>"Sean"</code><code>);</code>
<code>console.log(count);</code><code>// 5</code>
<code>console.log(arr);</code><code>// ["Lily", "lucy", "Tom", "Jack", "Sean"]</code>
<code>var</code> <code>item = arr.pop();</code>
<code>console.log(item);</code><code>// Sean</code>
<code>console.log(arr);</code><code>// ["Lily", "lucy", "Tom", "Jack"]</code>
3、shift() 和 unshift()
shift():删除原數組第一項,并傳回删除元素的值;如果數組為空則傳回undefined 。
unshift:将參數添加到原數組開頭,并傳回數組的長度 。
這組方法和上面的push()和pop()方法正好對應,一個是操作數組的開頭,一個是操作數組的結尾。
<code>var</code> <code>count = arr.unshift(</code><code>"Jack"</code><code>,</code><code>"Sean"</code><code>);</code>
<code>console.log(arr);</code><code>//["Jack", "Sean", "Lily", "lucy", "Tom"]</code>
<code>var</code> <code>item = arr.shift();</code>
<code>console.log(item);</code><code>// Jack</code>
<code>console.log(arr);</code><code>// ["Sean", "Lily", "lucy", "Tom"]</code>
4、sort()
sort():按升序排列數組項——即最小的值位于最前面,最大的值排在最後面。
在排序時,sort()方法會調用每個數組項的 toString()轉型方法,然後比較得到的字元串,以确定如何排序。即使數組中的每一項都是數值, sort()方法比較的也是字元串,是以會出現以下的這種情況:
<code>var</code> <code>arr1 = [</code><code>"a"</code><code>,</code><code>"d"</code><code>,</code><code>"c"</code><code>,</code><code>"b"</code><code>];</code>
<code>console.log(arr1.sort());</code><code>// ["a", "b", "c", "d"]</code>
<code>arr2 = [13, 24, 51, 3];</code>
<code>console.log(arr2.sort());</code><code>// [13, 24, 3, 51]</code>
<code>console.log(arr2);</code><code>// [13, 24, 3, 51](元數組被改變)</code>
為了解決上述問題,sort()方法可以接收一個比較函數作為參數,以便我們指定哪個值位于哪個值的前面。比較函數接收兩個參數,如果第一個參數應該位于第二個之前則傳回一個負數,如果兩個參數相等則傳回 0,如果第一個參數應該位于第二個之後則傳回一個正數。以下就是一個簡單的比較函數:
8
9
10
11
<code>function</code> <code>compare(value1, value2) {</code>
<code>if</code> <code>(value1 < value2) {</code>
<code>return</code> <code>-1;</code>
<code>}</code><code>else</code> <code>if</code> <code>(value1 > value2) {</code>
<code>return</code> <code>1;</code>
<code>}</code><code>else</code> <code>{</code>
<code>return</code> <code>0;</code>
<code>console.log(arr2.sort(compare));</code><code>// [3, 13, 24, 51]</code>
如果需要通過比較函數産生降序排序的結果,隻要交換比較函數傳回的值即可:
<code>console.log(arr2.sort(compare));</code><code>// [51, 24, 13, 3]</code>
5、reverse()
reverse():反轉數組項的順序。
<code>var</code> <code>arr = [13, 24, 51, 3];</code>
<code>console.log(arr.reverse());</code><code>//[3, 51, 24, 13]</code>
<code>console.log(arr);</code><code>//[3, 51, 24, 13](原數組改變)</code>
6、concat()
concat() :将參數添加到原數組中。這個方法會先建立目前數組一個副本,然後将接收到的參數添加到這個副本的末尾,最後傳回新建構的數組。在沒有給 concat()方法傳遞參數的情況下,它隻是複制目前數組并傳回副本。
<code>var</code> <code>arr = [1,3,5,7];</code>
<code>var</code> <code>arrCopy = arr.concat(9,[11,13]);</code>
<code>console.log(arrCopy);</code><code>//[1, 3, 5, 7, 9, 11, 13]</code>
<code>console.log(arr);</code><code>// [1, 3, 5, 7](原數組未被修改)</code>
從上面測試結果可以發現:傳入的不是數組,則直接把參數添加到數組後面,如果傳入的是數組,則将數組中的各個項添加到數組中。但是如果傳入的是一個二維數組呢?
<code>var</code> <code>arrCopy2 = arr.concat([9,[11,13]]);</code>
<code>console.log(arrCopy2);</code><code>//[1, 3, 5, 7, 9, Array[2]]</code>
<code>console.log(arrCopy2[5]);</code><code>//[11, 13]</code>
上述代碼中,arrCopy2數組的第五項是一個包含兩項的數組,也就是說concat方法隻能将傳入數組中的每一項添加到數組中,如果傳入數組中有些項是數組,那麼也會把這一數組項當作一項添加到arrCopy2中。
7、slice()
slice():傳回從原數組中指定開始下标到結束下标之間的項組成的新數組。slice()方法可以接受一或兩個參數,即要傳回項的起始和結束位置。在隻有一個參數的情況下, slice()方法傳回從該參數指定位置開始到目前數組末尾的所有項。如果有兩個參數,該方法傳回起始和結束位置之間的項——但不包括結束位置的項。
<code>var</code> <code>arr = [1,3,5,7,9,11];</code>
<code>var</code> <code>arrCopy = arr.slice(1);</code>
<code>var</code> <code>arrCopy2 = arr.slice(1,4);</code>
<code>var</code> <code>arrCopy3 = arr.slice(1,-2);</code>
<code>var</code> <code>arrCopy4 = arr.slice(-4,-1);</code>
<code>console.log(arr);</code><code>//[1, 3, 5, 7, 9, 11](原數組沒變)</code>
<code>console.log(arrCopy);</code><code>//[3, 5, 7, 9, 11]</code>
<code>console.log(arrCopy2);</code><code>//[3, 5, 7]</code>
<code>console.log(arrCopy3);</code><code>//[3, 5, 7]</code>
<code>console.log(arrCopy4);</code><code>//[5, 7, 9]</code>
arrCopy隻設定了一個參數,也就是起始下标為1,是以傳回的數組為下标1(包括下标1)開始到數組最後。
arrCopy2設定了兩個參數,傳回起始下标(包括1)開始到終止下标(不包括4)的子數組。
arrCopy3設定了兩個參數,終止下标為負數,當出現負數時,将負數加上數組長度的值(6)來替換該位置的數,是以就是從1開始到4(不包括)的子數組。
arrCopy4中兩個參數都是負數,是以都加上數組長度6轉換成正數,是以相當于slice(2,5)。
8、splice()
splice():很強大的數組方法,它有很多種用法,可以實作删除、插入和替換。
删除:可以删除任意數量的項,隻需指定 2 個參數:要删除的第一項的位置和要删除的項數。例如, splice(0,2)會删除數組中的前兩項。
插入:可以向指定位置插入任意數量的項,隻需提供 3 個參數:起始位置、 0(要删除的項數)和要插入的項。例如,splice(2,0,4,6)會從目前數組的位置 2 開始插入4和6。
替換:可以向指定位置插入任意數量的項,且同時删除任意數量的項,隻需指定 3 個參數:起始位置、要删除的項數和要插入的任意數量的項。插入的項數不必與删除的項數相等。例如,splice (2,1,4,6)會删除目前數組位置 2 的項,然後再從位置 2 開始插入4和6。
splice()方法始終都會傳回一個數組,該數組中包含從原始數組中删除的項,如果沒有删除任何項,則傳回一個空數組。
<code>var</code> <code>arrRemoved = arr.splice(0,2);</code>
<code>console.log(arr);</code><code>//[5, 7, 9, 11]</code>
<code>console.log(arrRemoved);</code><code>//[1, 3]</code>
<code>var</code> <code>arrRemoved2 = arr.splice(2,0,4,6);</code>
<code>console.log(arr);</code><code>// [5, 7, 4, 6, 9, 11]</code>
<code>console.log(arrRemoved2);</code><code>// []</code>
<code>var</code> <code>arrRemoved3 = arr.splice(1,1,2,4);</code>
<code>console.log(arr);</code><code>// [5, 2, 4, 4, 6, 9, 11]</code>
<code>console.log(arrRemoved3);</code><code>//[7]</code>
9、indexOf()和 lastIndexOf()
indexOf():接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。其中, 從數組的開頭(位置 0)開始向後查找。
lastIndexOf:接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。其中, 從數組的末尾開始向前查找。
這兩個方法都傳回要查找的項在數組中的位置,或者在沒找到的情況下傳回1。在比較第一個參數與數組中的每一項時,會使用全等操作符。
<code>var</code> <code>arr = [1,3,5,7,7,5,3,1];</code>
<code>console.log(arr.indexOf(5));</code><code>//2</code>
<code>console.log(arr.lastIndexOf(5));</code><code>//5</code>
<code>console.log(arr.indexOf(5,2));</code><code>//2</code>
<code>console.log(arr.lastIndexOf(5,4));</code><code>//2</code>
<code>console.log(arr.indexOf(</code><code>"5"</code><code>));</code><code>//-1</code>
10、forEach()
forEach():對數組進行周遊循環,對數組中的每一項運作給定函數。這個方法沒有傳回值。參數都是function類型,預設有傳參,參數分别為:周遊的數組内容;第對應的數組索引,數組本身。
<code>var</code> <code>arr = [1, 2, 3, 4, 5];</code>
<code>arr.forEach(</code><code>function</code><code>(x, index, a){</code>
<code>console.log(x +</code><code>'|'</code> <code>+ index +</code><code>'|'</code> <code>+ (a === arr));</code>
<code>});</code>
<code>// 輸出為:</code>
<code>// 1|0|true</code>
<code>// 2|1|true</code>
<code>// 3|2|true</code>
<code>// 4|3|true</code>
<code>// 5|4|true</code>
11、map()
map():指“映射”,對數組中的每一項運作給定函數,傳回每次函數調用的結果組成的數組。
下面代碼利用map方法實作數組中每個數求平方。
<code>var</code> <code>arr2 = arr.map(</code><code>function</code><code>(item){</code>
<code>return</code> <code>item*item;</code>
<code>console.log(arr2);</code><code>//[1, 4, 9, 16, 25]</code>
12、filter()
filter():“過濾”功能,數組中的每一項運作給定函數,傳回滿足過濾條件組成的數組。
<code>var</code> <code>arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];</code>
<code>var</code> <code>arr2 = arr.filter(</code><code>function</code><code>(x, index) {</code>
<code>return</code> <code>index % 3 === 0 || x >= 8;</code>
<code>console.log(arr2);</code><code>//[1, 4, 7, 8, 9, 10]</code>
13、every()
every():判斷數組中每一項都是否滿足條件,隻有所有項都滿足條件,才會傳回true。
<code>var</code> <code>arr2 = arr.every(</code><code>function</code><code>(x) {</code>
<code>return</code> <code>x < 10;</code>
<code>console.log(arr2);</code><code>//true</code>
<code>var</code> <code>arr3 = arr.every(</code><code>function</code><code>(x) {</code>
<code>return</code> <code>x < 3;</code>
<code>console.log(arr3);</code><code>// false</code>
14、some()
some():判斷數組中是否存在滿足條件的項,隻要有一項滿足條件,就會傳回true。
<code>var</code> <code>arr2 = arr.some(</code><code>function</code><code>(x) {</code>
<code>var</code> <code>arr3 = arr.some(</code><code>function</code><code>(x) {</code>
<code>return</code> <code>x < 1;</code>
15、reduce()和 reduceRight()
這兩個方法都會實作疊代數組的所有項,然後建構一個最終傳回的值。reduce()方法從數組的第一項開始,逐個周遊到最後。而 reduceRight()則從數組的最後一項開始,向前周遊到第一項。
這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選的)作為歸并基礎的初始值。
傳給 reduce()和 reduceRight()的函數接收 4 個參數:前一個值、目前值、項的索引和數組對象。這個函數傳回的任何值都會作為第一個參數自動傳給下一項。第一次疊代發生在數組的第二項上,是以第一個參數是數組的第一項,第二個參數就是數組的第二項。
下面代碼用reduce()實作數組求和,數組一開始加了一個初始值10。
<code>var</code> <code>values = [1,2,3,4,5];</code>
<code>var</code> <code>sum = values.reduceRight(</code><code>function</code><code>(prev, cur, index, array){</code>
<code>return</code> <code>prev + cur;</code>
<code>},10);</code>
<code>console.log(sum);</code><code>//25</code>