【從0到1學javascript】javascript資料結構----數組,javascript資料結構

來源:互聯網
上載者:User

【從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 ]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.