天天看點

JS-數組數組

數組

1.數組的概述

js中的數組是可以存放任意資料類型值的集合,數組的元素可以是任意資料類型,數組的長度可以動态調整。

2.數組的建立

  • 字面量方式

    由一對中括号“[ ]”包裹數組的元素,元素之間用逗号 “,” 隔開。

//元素可以是任意的資料類型
 var arr = [123,"hello",function(){},null];
           
  • 構造函數方式

    通過Array() 構造函數來建立數組

/*如果傳入的參數是一個number類型的整數,則代表建立的數組長度,如果是小數則會報錯,
如果是其他類型的則會當成元素存進去。*/
var arr = new Array();
//建立一個長度為6的數組
var arr = new Array(6)
/*建立一個包含三個元素,長度為3的數組[ 3, 5, 'hello' ]。
(注:如果是字元串的參數,記得加引号)*/
var arr = new Array(3,4,'hello')
           

3.數組的通路

  • 通路數組元素

    數組變量名[索引],索引值從0開始,到數組長度length-1.

//如果索引值大于數組長度或者為負數,傳回undefined。
var arr = [123,'hello'];
arr[0];	//通路數組的第一個元素,傳回值為123
arr[3];	//undefined
//可以通過索引改變數組元素
arr[0] = 456;	//把數組第一個元素123改成456
//如果索引大于數組長度,則會在指定的位置增加新的元素,并且數組長度變成索引值+1
arr[4] = 'world';	//[ 456, 'hello', <2 empty items>, 'world' ],數組長度變成5
           

4.數組API

4.1數組序列化

toString() 以字元串形式傳回數組元素,并用逗号分隔

join() 以字元串形式傳回數組元素,并用括号裡指定的字元串分隔(括号裡的分隔字元串要加引号)

4.2構造函數的方法

  • Array.isArray()

    判斷某個變量是否是一個數組對象

  • Array.from()

    從類數組對象或者可疊代對象中建立一個新的數組執行個體。即把傳進括号裡的對象分解成單獨的字元串,然後形成一個新的數組。

//[ '1', '2', '3', '4', '5', '6' ]
 var Arr = Array.from("123456");
           
  • Array.of()

根據一組參數來建立新的數組執行個體,支援任意的參數數量和類型。

Array.of(7);       // [7] 
Array.of(1, 2, 3); // [1, 2, 3]
           

這個方法的主要目的,是彌補數組構造函數Array()的不足。因為參數個數的不同,會導緻Array()的行為有差異。 Array.of()方法基本上可以用來替代Array()或new Array().

4.3棧與隊列方法

  • Array.prototype.push()

    向數組的末尾添加一個或多個元素,傳回值是數組的新長度。

  • Array.prototype.pop()

    删除數組的最後一個元素,傳回值是被删除的元素。

  • Array.prototype.shift()

    删除數組的第一個元素,傳回值是第一個元素的值。

  • Array.prototype.unshift()

    向數組的開頭添加一個或多個元素,傳回值是數組的新長度。

注:以上四種方法都會改變原數組的長度。

排序方法

  • Array.prototype.reverse()

    用于颠倒數組中元素的順序,傳回值是颠倒後的數組。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse();//[ 'Mango', 'Apple', 'Orange', 'Banana' ]
           
  • Array.prototype.sort()

    用于對數組元素進行排序,預設按字母升序(Ascall編碼)。如果是數字,則預設隻比較第一個數字的大小進行升序。

如果想要進行真正的數字排序,則需要自己定義一個函數作為參數進行調用。

數字升序:

var arr = [5,80,60,9,10];
 arr.sort(function(a,b){
 	return a-b;
 })
 //[ 5, 9, 10, 60, 80 ]
           

降序的話則把函數傳回值改成 b-a就可以了。

因為無論是a>b還是b>a,return a-b 總能得到升序的結果,而 return b-a 總能得到降序的結果。

注:以上兩種排序方式都會改變原數組,而不會建立新的數組副本。

4.5 操作方法

  • Array.prototype.concat()

    用于連接配接兩個或者多個數組。

    說白了,concat()方法就是在原數組的後面拼接上傳入的參數。

參數是必需的,可以是數組對象,也可以是具體的值。傳回值是一個新的數組。

  • Array.prototype.slice()

    用于從數組中傳回標明的元素:[start,end)。

start:可選。開始選取的位置的索引值,如果為負數,則表示原數組的倒數第幾個元素開始。

end:可選。結束選取的位置的索引值。如果沒有該參數,則表示截取從start到數組結束的所有元素。如果為負數,則表示原數組的倒數第幾個元素結束。

傳回值:一個新的數組。包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。

  • Array.prototype.splice()

    splice() 方法用于添加或删除數組中的元素。

    注意: 這種方法會改變原始數組。

index:必需。在某個位置進行 添加/删除 的索引值,必須是數字。

howmany:可選。删除元素的個數,必須是數字。如果為0,則表示不删除元素;如果未規定,則表示删除從index開始到原數組末尾的所有元素。

item1, …, itemX:可選。要添加到數組的新元素。

傳回值:傳回由被删除的元素組成的新數組。如果沒有被删除的元素,則傳回一個空數組。

添加新的元素:

var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
//從數組索引位置 2 開始,不删除元素,添加兩個新的元素'帶土','琳'
Naruto.splice(2,0,'帶土','琳')
console.log(Naruto);//[ '鳴人', '佐助', '帶土', '琳', '卡卡西', '鼬', '柱間' ]
           

移除數組的第三個元素,并在數組第三個位置添加新元素:

var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
//在數組的第三個位置删除一個元素,并添加兩個新的元素
Naruto.splice(2,1,'帶土','琳')
console.log(Naruto);//[ '鳴人', '佐助', '帶土', '琳', '鼬', '柱間' ]
           

從第三個位置開始删除數組後的兩個元素:

var Naruto = ['鳴人','佐助','卡卡西','鼬','柱間']
Naruto.splice(2,2)
console.log(Naruto);[ '鳴人', '佐助', '柱間' ]
           

4.6 位置方法

  • Array.prototype.indexOf()

    從start處開始檢索目标元素item的位置,沒有指定start參數時則從頭開始檢索。

    傳回值:目标元素在數組中的位置,沒有檢索到則傳回-1

  • Array.prototype.lastIndexOf()

    此方法用于傳回目标元素在數組中最後出現的位置。

    如果有參數start,則從start處,向着數組開頭檢索;如果沒有,則從尾到頭開始檢索。

    傳回值:數組中該元素最後一次出現的索引,如未找到傳回-1。

4.7 疊代方法

  • Array.prototype.every()

    every()方法通過指定的函數檢測數組中的所有元素,隻有所有元素都符合條件才會傳回true,否則傳回false。

    注:此方法不會改變原始數組,不會對空數組進行檢測。

array.every(function(currentValue,index,arr){
	//函數代碼塊
}, thisValue)
           

function(currentValue,index,arr):必需。自己定義的函數。

thisValue:可選。對象作為該執行回調時使用,傳遞給函數,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值為 “undefined”。

currentValue:必需。目前數組元素的值。

index:可選。目前元素的索引值。

arr:可選。目前元素屬于的數組對象。

  • Array.prototype.some()

    some()方法用于檢測數組中是否存在滿足指定條件的元素。

    此方法會依次檢測每個數組,但隻要有一個元素滿足條件,則傳回true,并停止檢測,否則傳回false。

    注:不會對空數組檢測,不改變原數組。

  • Array.prototype.filter()

    filter()方法用于把符合條件的元素組成一個新的數組。

    注:不檢測空數組,不改變原數組。

傳回值:符合條件的元素組成的數組。如果沒有符合條件的元素則傳回空數組。

  • Array.prototype.map()

    map()方法,把元素經過函數處理過後的值(eg:函數把元素開平方,求和),組成新的數組。

    注:不檢測空數組,不改變原數組。

傳回值:一個新的數組。

  • Array.prototype.forEach()

    forEach()方法可以周遊數組的每一個元素,然後把元素傳遞給回調函數。

    注:forEach() 對于空數組是不會執行回調函數的。

傳回值:undefined

forEach()與map()差不多,但是前者是沒有傳回值的

- 不改變原數組的方法

join()—把數組的所有元素放入一個字元串。

toString()—把數組轉換為字元串,并傳回結果。

concat()—連接配接兩個或更多的數組,并傳回結果。

every()—檢測數組元素的每個元素是否都符合條件。

some()—檢測數組元素中是否有元素符合指定條件。

filter()—檢測數組元素,并傳回符合條件所有元素的數組。

indexOf()—搜尋數組中的元素,并傳回它所在的位置。

lastIndexOf()—傳回一個指定的字元串值最後出現的位置,在一個字元串中的指定位置從後向前搜尋。

map()—通過指定函數處理數組的每個元素,并傳回處理後的數組。

slice()—選取數組的的一部分,并傳回一個新數組。

valueOf()—傳回數組對象的原始值。

- 改變原數組的方法

pop()—删除數組的最後一個元素并傳回删除的元素。

push()—向數組的末尾添加一個或更多元素,并傳回新的長度。

shift()—删除并傳回數組的第一個元素。

unshift()—向數組的開頭添加一個或更多元素,并傳回新的長度。

reverse()—反轉數組的元素順序。

sort()—對數組的元素進行排序。

splice()—用于插入、删除或替換數組的元素。

繼續閱讀