JavaScript常用對象Array(2)

來源:互聯網
上載者:User

JavaScript常用對象Array(2)
數組的join方法數組拼接concat方法數組切分slice方法強大的splice方法indexOf以及lastIndexOf方法幾種常用的迭代方法數組的join方法

我們知道,數組的toString()以及toLocaleString()方法會返回以逗號分隔的數組字串。但是如果我們希望分隔字元不是單一的逗號,我們可以選擇使用join()方法。join()方法可以接受一個參數,這個參數就是我們希望的分隔字元,例如:

var colors = ["red", "blue", "white"];alert(colors.join("?"));

會得到:

red?blue?white

如果你沒有指定join()方法的參數:

alert(colors.join());

此時會預設使用逗號作為分隔字元:

red,blue,white
數組拼接concat方法

我們知道在字串的操作方法中,有用於字串拼接的concat()方法,在數組中同樣有該方法用於數組的拼接。

JS與Java等語言一個顯著的不同在於,Java等語言在調用一個函數的時候,傳入函數的參數必須嚴格與事先建立的函數簽名一致。而在JS中,解析器不僅不會去查驗傳入參數的資料類型,甚至連傳進來參數有幾個都不管。在使用concat()方法的時候,我們可以:

傳入一個或多個數組作為參數,concat()方法會首先建立一個原數組的副本,然後將作為參數傳入的數組依次添加在新數組末尾,最後返回該副本。

傳入一個或多個非數組值作為參數,concat()方法同樣會首先建立一個原數組的副本,然後對該副本進行操作,依次將傳入的值添加在該副本末尾然後返回。

傳入一個或多個數組、值的組合,操作方法同上。

實際上,JS並不要求傳入參數的資料類型、參數個數,同時JS中數組間的元素可以不同。concat()方法其實可以接受一個或多個任意類型的參數實現數組的拼接,雖然很多時候沒太大必要這樣做。個人認為這是JS賦予我們的自由,但是如何利用好這一點並不容易。

需要注意的是,concat()方法不會修改原始數組,而是建立一個原始數組的副本,對副本進行操作,然後將新的數組作為傳回值返回。舉個比較極端的例子:

function test() {  var arr = [];  var colors = ["red", "blue", "white"];  var hello = function() {    alert("hello world!");  }  arr = arr.concat(colors, false, 1, undefined, "yellow", ["gray", "black"], hello);  alert(arr);}   

以上代碼我們使用數組的concat()方法,在空數組arr後面依次拼接了數組colorsBoolean型false數值型1Undefined型,String型yellow數組["gray, "black"]以及一個函數。

以上代碼輸出如下:

數組切分slice方法

slice()方法用於切分出數組指定區間。它可以接受1個或2個參數。這兩個參數指定切分的起止位置。

當只傳入一個參數時,返回該位置到數組結尾的數組。

當傳入兩個參數時,放回第一個到第二個參數區間的子數組。(不包含第二個參數位置的元素)

比如說:

function test() {  var colors = ["red", "blue", "white", "gray", "green", "gold", "orange"];  var col1 = colors.slice(2);  var col2 = colors.slice(1, 4);  alert(colors + "\n" + col1 + "\n" + col2);}   

輸出:

我們可以看到,slice()方法並沒有改變原colors數組的值,同時切分出來的數組不包含第二個參數對應的項。

slice()方法傳入的參數可以為負數,負數的含義是從末尾開始的位移量。位置確定的方法是用數組長度和該參數相加。比如當數組長度length為10的情況下,slice(-3,-1)和slice(7, 9)是等價的。

另外需要說明的是,當第二個參數小於第一個參數的時候,該方法將返回一個空數組。

強大的splice方法

splice()方法可以刪除數組中指定項,在數組指定位置插入指定項。或者結合刪除和插入操作演變為在指定位置替換指定項。

刪除指定項

此時splice()方法接受兩個參數,第一個參數制定刪除的起始位置,第二個參數指定需要刪除的項數。該方法返回被刪除項組成的數組。如果沒有被刪除項則返回空數組。

function test() {  var colors = ["red", "blue", "white", "gray", "green", "gold", "orange"];  var col1 = colors.splice(1, 3);  alert(colors + "\n" + col1);}

輸出:

插入指定項

要在數組中插入指定項,splice()方法需要接受3個參數,第一個參數指定插入的起始位置,第二個為要刪除的個數(我們在這裡設為0,即不刪除任何項),第三個參數為要插入的項。例如:

function test() {  var colors = ["red", "blue", "white", "gray", "green"];  var col1 = colors.splice(1, 0, "brown", "orange");  alert(colors + "\n" + col1);}

輸出:

此時col1為一個空數組。

替換指定項

實際上,在插入指定項的操作中,第二個參數設為非零值即可刪除某些項再在該處插入指定項,由此完成替換的功能。

indexOf以及lastIndexOf方法

這兩個方法的功能均為在數組中尋找指定項的位置。它們都接受1~2個參數。第二個參數是可選的。

其中第一個參數指定需要尋找的項,第二個參數指定尋找的起始位置。只不過indexOf方法從數組的頭向後尋找,lastIndexOf方法從數組的尾向前尋找。當尋找成功時,返回匹配的位置,否則返回-1。

需要強調的是,這裡尋找成功需要和指定項全等(===)而不是”==”。

舉一個簡單的例子:

  var colors = ["red", "blue", "gray", "white", "gray", "blue", "red"];  var ind1 = colors.indexOf("gray");  var ind2 = colors.indexOf("gray", 3);  var ind3 = colors.lastIndexOf("gray");  var ind4 = colors.lastIndexOf("gray", 3);

以上代碼,ind1等於2,ind2等於4,ind3等於4,ind4等於2。

幾種常用的迭代方法

JS中,有比較方便地實現數組迭代的方法。以下介紹的5種迭代方法均接收1~2個參數。第一個參數指定要在數組每一項上執行的函數,第二個參數非必需,指定運行該函數的範圍對象。其中要作用於數組每一項的函數需要接收3個參數:數組項的值,該項在數組中的位置以及數組本身。說起來很抽象,看下裡的例子:

最基本的對數組每一項遍曆進行某種操作,我們可以用forEach()方法(類似於很多其他語言中的for迴圈),該方法沒有傳回值。如將數組每一項都加1:
var num = [1, 2, 3, 4, 5, 6, 7];var forfun = function(item, ind, array) {  array[ind] += 1;}var rst = num.forEach(forfun);alert(num);

得到以下輸出:

如果我們要檢測是否數組的每一項都滿足某種條件可以使用every()方法,只有當數組中所有項都滿足條件時才會返回ture,否則返回false。
var num = [1, 2, 3, 4, 5, 6, 7];var everfun = function(item, ind, array) {  return (item > 3);}var rst = num.every(everfun);

以上代碼會檢測是否數組中每一項都大於3,只有當數組每一項都滿足條件時,every()方法才會返回true。顯然上例返回false。

如果我們要檢測數組中是否存在某些項滿足某種條件可以使用some()方法,與every()不同,當數組中存在某些項滿足條件時,就會返回true。
var num = [1, 2, 3, 4, 5, 6, 7];var somefun = function(item, ind, array) {  return (item > 3);}var rst = num.some(somefun);

數組中存在大於3的項,rst值返回true。

如果我們希望過濾出數組中滿足某種條件的項,可以使用filter()方法,該方法會返回數組中滿足條件的項(返回true的項)組成的新數組。
var num = [1, 2, 3, 4, 5, 6, 7];var filterfun = function(item, ind, array) {  return (item > 3);}var rst = num.filter(filterfun);alert(num + "\n" + rst);

會得到以下輸出:

1,2,3,4,5,6,74,5,6,7
如果我們希望對數組進行某種映射操作,即對數組每一項進行某總操作並返回操作結果,可以使用map()方法。比如我們可以將一個數組映射到是否大於3的真值表中:
var num = [1, 2, 3, 4, 5, 6, 7];var mapfun = function(item, ind, array) {  return (item > 3);}var rst = num.map(mapfun);alert(num + "\n" + rst);

得到以下輸出:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.