Array數組

ECMAScript的數組,每一項可以保存任何類型的數據,數組的大小可以動態調整。


創建方法

  1. 構造函數

    1. var 變量名 = new Array(數組長度(可爲空));
    2. var 變量名 = new Array(項0,項1………...);
    
  2. 數組字面量

    var 變量名= [項0,項1………(可爲空)];
    

檢測數組

1. 變量名 instanceof Array;    (instanceof假定只有一個全局執行環境,當網頁 包含多個框架時不適用)
2. Array.isArray(變量名);     
(不管arr是在哪個全局執行環境中創建的)

轉換方法

1. arr.toString() //返回字符串,以逗號分割每一項
2. arr.toLocaleString() //返回字符串,以逗號分割每一項
3. arr.valueof()     //返回數組,以逗號分割每一項
4. arr.join(“分隔符”)   返回字符串,以自定義的分隔符分割每一項,若不傳入分隔符,默認爲逗號

若數組某項爲null 或 undefined,在以上方法中, 該項顯示爲空字符串

棧方法 LIFO

1. 正方向模擬棧:
    ▪ 在數組末尾添加新項: arr.push(新項j,新項k…….);  // 返回數組新的長度
    ▪ 在數組末尾移除項: arr.pop();  //返回移除的項

2. 反方向模擬棧:
    ▪ 在數組頭部添加新項: arr.unshift(新項j,新項k…….);  // 返回數組新的長度
    ▪ 在數組頭部移除項: arr.shift();  //返回移除的項

隊列方法 FIFO

1. 正方向模仿隊列:
    ▪ 在數組末尾添加新項: arr.push(新項j,新項k…….);  // 返回數組新的長度
    ▪ 在數組頭部移除項: arr.shift();  //返回移除的項

2. 反方向模擬隊列:
     ▪ 在數組頭部添加新項: arr.unshift(新項j,新項k…….);  // 返回數組新的長度
     ▪ 在數組末尾移除項: arr.pop();  //返回移除的項

重排序方法

1. arr.reverse()   //反轉數組項的順序
2. arr.sort()  //默認升序排列數組項,但是比較的是字符串,所以會出現 (1,10,2)的結果。
因此,最好用sort(function),接受一個比較函數

sort()數組排序

//數值類型or 其valueOf方法返回數值類型的對象類型
function compare(value1,value2){
    return value1-value2;  //升序
    或者
    return value2-value1; //降序
}
var arrays = ["80", "9", "700", 40, 1, 5, 200];
arrays.sort(compare);
console.log(arrays); //[ 1, 5, '9', 40, '80', 200, '700' ]升序
                    //[ '700', 200, '80', 40, '9', 5, 1 ]降序
//自實現sort方法原理
var ascsort = function(value1,value2){
    return value1 - value2;
}

function descsort(value1,value2){
    return value2-value1;
}

Array.prototype.mysort = function(fn){
    fn = fn || function(x,y){return x-y;};  //默認升序
    for(var i =0;i<this.length;i++){
        for(var j=i;j<this.length;j++){
            if(fn(arr[i],arr[j])>0){
                arr[i] ^= arr[j];
                arr[j] ^= arr[i];
                arr[i] ^= arr[j];
            }
        }
    }
}
var arr=new Array(1,10,9,22,100,31);
arr.mysort();
console.log(arr);//[ 1, 9, 10, 22, 31, 100 ]
arr.mysort(ascsort);
console.log(arr);//[ 1, 9, 10, 22, 31, 100 ]
arr.mysort(descsort);
console.log(arr);//[ 100, 31, 22, 10, 9, 1 ]
//根據對象的屬性來排序
function createComparisonFunction(propertyName){
    return function(object1,object2){
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
        //忽略大小寫
        if(propertyName == "name"){
            value1 = value1.toLowerCase();
            value2 = value2.toLowerCase();
        }
        return +(value1 > value2)||-(value1 < value2);

    };
}
var data = [{name:"Zachary",age:28},{name:"cicholas",age:30},{name:"karine",age:40},{name:"Aicholas",age:25},{name:"karine",age:40}];
data.sort(createComparisonFunction("name"));
console.log(data);
//[ { name: 'Aicholas', age: 25 },
// { name: 'cicholas', age: 30 },
//  { name: 'karine', age: 40 },
//  { name: 'karine', age: 40 },
//  { name: 'Zachary', age: 28 } ]
data.sort(createComparisonFunction("age"));
console.log(data);
//[ { name: 'Aicholas', age: 25 },
//  { name: 'Zachary', age: 28 },
//  { name: 'cicholas', age: 30 },
//  { name: 'karine', age: 40 },
//  { name: 'karine', age: 40 } ]

分析一下return語句“return +(value1 > value2)||-(value1 < value2);”:

▪ value1>value2  ->  +true||-false   ->  1||-0    ->  1
▪ value1<value2  ->  +false||-true   ->  0|| -1   -> -1
▪ value1=value2  ->  +false||-false  ->  0||-0    -> -0

操作方法

1. arr.concat(參數(可以是新項or數組))    複製數組arr,在副本數組末尾添加參數,不改變原數組。
    *與arr.push(參數)的區別:
        ▪ push方法直接改變原數組,push方法如果接受的參數爲數組,會把該參數視爲一個項。
        ▪ concat方法不改變原數組,concat方法如果接受的參數爲數組,會把該參數的每個項視爲單獨的項。

2. arr.slice(起始位置,結束位置(可不寫))  //返回(arr[起始位置]到arr[結束位置-1])的數組,不改變原數組

3. arr.splice(起始位置,要刪除的項數,插入/替換的項(可不寫))  //返回包含刪除項的數組,改變原數組
    ▪ 刪除  arr.splice(2,5);   // 返回空數組,原arr變成從arr[2]到arr[4]
    ▪ 插入 arr.splice(1,0,"red","green");  //返回空數組,red、green從原arr的arr[1]插入
    ▪ 替換 arr.splice(1,3,"red","green"); //返回包含arr[1],arr[2],arr[3]的數組,
red、green從原arr的arr[1]插入
arr[1],arr[2],arr[3]的數組,red、green從原arr的arr[1]插入
var arr1=new Array(0,1,2);
var arr2=[4,5,6];
var arr3=arr2.concat(arr1);
console.log(arr3); //[ 4, 5, 6, 0, 1, 2 ]
arr3[1]=6;
arr3[3]=1;
console.log(arr3); //[ 4, 6, 6, 1, 1, 2 ]
console.log(arr1);  //[ 0, 1, 2 ]不會改變原數組
console.log(arr2);  //[ 4, 5, 6 ]不會改變原數組
---------------------------------------------------

var arr5={name:"lala"};
var arr6=[4,5,6];
var arr7=arr6.concat(arr5);//拷貝的是對象引用
console.log(arr7); //[ 4, 5, 6, { name: 'lala' } ]
arr7[3]["name"]="xixi";
console.log(arr7); //[ 4, 5, 6, { name: 'xixi' } ]
console.log(arr6); //[ 4, 5, 6] 不會改變原數組
console.log(arr5["name"]);  //xixi,作爲參數的arr5原數組被改變

位置方法

1. arr.indexOf(起始位置(可不寫),待查找元素)  //在數組頭部往後查找,返回元素在數組的位置,找不到返回-1
2. arr.lastIndexOf(結束位置(可不寫),待查找元素) //在數組末尾往前查找,返回元素在數組的位置,找不到返回-1

迭代方法(不改變原數組)

作爲參數的函數會接收3個參數:item,index,array

1. arr.every(函數)   //如果函數對數組每一項都返回true,則返回true
2. arr.some(函數) //如果函數對數組某一項返回true,則返回true
3. arr.filter(函數) //返回一個由函數返回true的項組成的數組
4. arr.map(函數)  //返回每一項調用函數的結果組成的數組
5.  arr.forEach(函數) //沒有返回值,每一項執行函數。

歸併方法

作爲參數的函數會接收4個參數:prev, cur, index, array

1. arr.reduce(函數)  從數組第一項開始,遍歷到最後
2. arr.reduceRight(函數)  從數組最後一項開始,遍歷到第一項。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章