【從0到1學javascript】javascript資料結構----數組,javascript資料結構
javascript中對數組的定義
數組是一種特殊的對象,用來表示位移量的索引是該對象的屬性,索引可以是整數。這些數字索引在內部被轉換成字串類型。這是因為javascript對象中的屬性名稱必須是字串。數組在javascript中只是一種特殊的對象,效率上沒有其它語言數組的效率高。
1.1建立數組的方式
//初始化數組以下的兩種聲明方式相同console.log('-----數組的聲明方式-----');var array1 = [];var array2 = new Array();//建立數組時指明數組長度console.log('-----建立數組時可以指明數組長度-----');var array3 = new Array(3);console.log(array3.length);array3[4] = 5;console.log(array3);//聲明有預設值的數組,且數組中的元素不必是同一種類型(與強型別語言有區別)console.log('-----預設值的數組-----');var array4 = [1,'22',3];var array5 = new Array(1,'22',3);console.log(array4);console.log(array5);//怎麼初始化一個數組,通過設定Array對象的length為0console.log('------初始化一個數組----');console.log(array5);array5.length =0;console.log(array5);
結果:
判斷是否是javascript數組的方法:
//判斷是否是數組的方法var array5 =[];console.log(typeof array5 ==Array); //falseconsole.log(typeof array5 ===Array); //falseconsole.log(typeof array5); //objectconsole.log(Array.isArray(array5)); //trueconsole.log(array5 instanceof Array); //true
由上可以知道當我們要判斷是否是js數組的時候typeof操作符是不好用的,可以使用instanceof操作符或者是使用Array對象的內建函數isArray()。
1.2對數組的操作
var array1 =[1,2,3,4];var array2 = array1;array2[2] =5;console.log(array1);console.log(array2);
結果:
[ 1, 2, 5, 4 ]
[ 1, 2, 5, 4 ]
由結果知道簡單的賦值操作只是所謂的淺複製(引用複製)。深複製和淺複製區別點擊這裡
一個擴充Array對象自身方法的深複製:
Array.prototype.deepCopy = function(array){ var tempArray = []; //判斷array參數不是null ,undefined,0,'',nan,false if (array){ for (var i =0,len = array.length;i<len;i++){ tempArray[i] = array[i]; } return tempArray; } return null;}var array1 =[1,2,3,4];var array2 = array1;var array3 = [];array2[2] =5;console.log(array1);console.log(array2);array3 = array3.deepCopy(array1);console.log(array3);array3[0] = 78;console.log(array1);console.log(array3);
結果:
[ 1, 2, 5, 4 ]
[ 1, 2, 5, 4 ]
[ 1, 2, 5, 4 ]
[ 1, 2, 5, 4 ]
[ 78, 2,5, 4 ]
2.1數組中尋找元素
先拋一塊“石頭“,最常見的數組去重問題:
代碼:
var array1 = [1, 2, 3, 4, 5, 5, 4, 2, 7, 8];Array.prototype.UnRepeat = function(array) { var temp = []; for (var i = 0, len = array.length; i < len; i++) { if (temp.length != 0) { for (var m = 0; m < temp.length; m++) { var isExist = false; if (array[i] == temp[m]) { isExist = true; break; } } if (isExist == false) { temp.push(array[i]); } } else { temp.push(array[i]); } } return temp;}
結果:
[ 1, 2, 3, 4, 5 ]
以上代碼可以滿足對數組進行去重的操作。但是時間複雜度較高為T(n) = O(n^2) 。其實在原生得javascript中提供了方法支援尋找元素的操作。分別是indexOf()和lastIndexOf()
最佳化後的代碼
Array.prototype.UnRepeat1 = function(array) { var temp = [], indexResult; for (var i = 0, len = array.length; i < len; i++) { indexResult = temp.indexOf(array[i]) if (indexResult == -1 && indexResult != null) { temp.push(array[i]); } } return temp;}
結果:
[ 1, 2, 3, 4, 5, 7, 8 ]
此時的時間複雜度為T(n) = O(n)
2.2數組的排序
看一段代碼:
var nums = [1,5,9,2,3];//將數組中的元素反轉nums.reverse();console.log(nums);//當數組元素是字串時可以使用sort()var strArray = ['qwe','erere','sdsf','hghgj'];strArray.sort();console.log(strArray);//對數字進行sort()方法var numArray = [1,45,67,23,09,100];numArray.sort();console.log(numArray);
結果如下:
[ 3, 2, 9, 5, 1 ]
[ ‘erere’, ‘hghgj’, ‘qwe’, ‘sdsf’ ]
[ 1, 100, 23, 45, 67, 9 ]
可以很清楚的指導當數組的元素都是數位時候,使用sort()方法對數組排序是沒有效果的。這是為什麼呢?
sort()方法是按照字典順序進行排序的。因此當使用sort()方法時,如果被排序元素非數字就會直接按照字典順序進行排序。如果是數字在內部就會先進行轉化,將數字轉化為字串。
為了能夠讓sort()方法也能夠排序數字元素,可以在sort()方法中傳入一個比較大小的函數。sort()將會根據函數根據函數確定元素的大小,並且確定數組的順序。
看下面的一段代碼:
//對數字進行sort()方法var numArray = [1,45,67,23,09,100];numArray.sort();console.log(numArray);function sortNum(num1,num2){ //減號操作符會將兩邊的字串強制轉換為數字 return num1 - num2;}numArray.sort(sortNum);console.log(numArray);
結果為:
[ 1, 9, 23, 45, 67, 100 ]
3.1數組的迭代器方法3.1.1不產生新數組的迭代器方法
forEach()該方法接受一個函數參數,對數組的所有元素運用該函數
var numArray = [1,45,67,23,09,100];function eachFunc(num){ console.log( num + '字串');}numArray.forEach(eachFunc);console.log(numArray);
結果:
1字串
9字串
23字串
45字串
67字串
100字串
[ 1, 9, 23, 45, 67, 100 ]
定義:
every()和some()方法接受一個傳回值為布爾類型的函數,對數組中的元素使用該函數.如果對於所有的元素.該函數的傳回值都是true,則該方法返回true.
代碼如下:
var numArray = [1, 45, 67, 23, 09, 100];var numArray1 = [-1, 45, 67, 23, 09, 100];function eveFunc(num) { return num > 0;}function resultFunct(result) { if (result) { console.log('全部為正數.'); } else { console.log('有負數存在.'); }}var result = numArray.every(eveFunc);resultFunct(result);var result1 = numArray1.every(eveFunc);resultFunct(result1);
結果:
全部為正數.
有負數存在.
3.1.2產生新數組的迭代器方法
map()和filter()對數組的每個元素應用該函數.但是map()會返回一個新數組.
filter()函數與every()函數類似,every()函數當所有元素滿足條件時返回true,而filter()函數返回一個新數組.
function mapFunc(num){ return num *2;}var numArray1 = [-1, 45, 67, 23, 09, 100];var resultMap = numArray1.map(mapFunc);console.log(resultMap);
結果:
[ -2, 90, 134, 46, 18, 200 ]