1. 程式人生 > 實用技巧 >招式百出的陣列(js)

招式百出的陣列(js)

陣列

陣列的作用是:使用單獨的變數名來儲存一系列的值。陣列是可以儲存任意資料型別的資料。

1、建立

// 1、字面量 推薦
var arr = []; // 建立一個空陣列
var arr = [1, 2, 3];
var arr = [1, 'ab', true, null, undefined, {}, [], function () { }, new Date()]; // 陣列可以儲存任意資料型別
console.log(arr);
​
// 2、建構函式
var arr = new Array();
var arr = new Array(1, 2, 3);
var arr = new Array(3); //
[undefined, undefined, undefined] 這個3即陣列的長度 var arr = new Array('3'); // [ "3" ] console.log(arr);

2、讀、寫、遍歷

var arr = ['曹操', '劉備', '孫權'];
​
// 讀:陣列[下標]
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr[5]); // undefined  讀取一個不存在的下標,返回undefined
​
​
// 寫:陣列[下標] = 新值
arr[0] = '小美'; //
[ "小美", "劉備", "孫權" ] arr[5] = '老王'; // [ "小美", "劉備", "孫權", undefined, undefined, "老王" ] console.log(arr); ​ // ---------------------- // 遍歷(不要用for-in) for (var i = 0; i < arr.length; i++) { console.log(arr[i]); }

3、陣列的長度

陣列長度,可讀可寫

var arr = ['劉備', '關羽', '張飛'];
​
//
console.log(arr.length); // 3
// arr.length = 5; // [ "劉備", "關羽", "張飛", undefined, undefined ] arr.length = 1; // [ "劉備" ] console.log(arr);

4、棧方法

1、陣列頭部或尾部新增或刪除

var arr = ['劉備', '關羽', '張飛'];
​
// 陣列.push(引數);
// 在陣列的尾部新增,返回陣列新的長度
var n = arr.push('張三', '隔壁老王');
console.log(arr);
console.log(n);
​
// 陣列.unshift(引數);
// 在陣列的頭部新增,返回陣列新的長度
var n = arr.unshift('小美');
console.log(arr);
console.log(n);
​
// 陣列.pop();
// 刪除陣列最後一項,返回被刪除的項
var n = arr.pop();
console.log(arr);
console.log(n);
​
// 陣列.shift();
// 刪除陣列的第一項,返回被刪除的項
var n = arr.shift();
console.log(arr);
console.log(n);

2、強大的splice方法,可以實現任意位置的新增、刪除、替換

陣列.splice(起始下標, 要刪除的個數, 要新增的項...); 返回被刪除的項組成的陣列

var arr = ['劉備', '關羽', '張飛'];
​
// 新增
var n = arr.splice(2, 0, '關平', '關興');
console.log(arr); // [ "劉備", "關羽", "關平", "關興", "張飛" ]
console.log(n); // []
// 刪除
var n = arr.splice(1, 1);
console.log(arr); // [ "劉備", "張飛" ]
console.log(n); // [ "關羽" ]
// 替換
var n = arr.splice(1, 1, '小鄧', '老王');
console.log(arr); // [ "劉備", "小鄧", "老王", "張飛" ]
console.log(n); // [ "關羽" ]

5、陣列拼接

陣列.concat(引數); 引數可以是陣列,也可以是其它項。返回拼接以後的陣列,不修改原陣列

var arr1 = [1, 2, 3];
var arr2 = ['a', 'b', 'c'];
​
// [1, 2, 3, 'a', 'b', 'c']
// var arr = arr1.concat(arr2, '小鄧', '老王');
// console.log(arr1);
// console.log(arr2);
// console.log(arr);
// --------------------
// 推薦用法
var arr = [].concat(arr1, arr2, '小鄧', '老王');
console.log(arr);

6、sort排序

陣列.sort();

預設規則:按字串排序,即便是數字,哪也是按字串排序。會修改原陣列

// 預設規則排序
var arr = [4, 6, 21, 9, 1, 7];
arr.sort();
console.log(arr); // [ 1, 21, 4, 6, 7, 9 ]
// --------------------------
// 比較函式接收兩個引數,如果第一個引數應該位於第二個之前則返回一個負數,如果兩個引數相等則返回 0,如果第一個引數應該位於第二個之後則返回一個正數。
// 從小到大
var arr = [4, 6, 21, 9, 1, 7];
arr.sort(function (a, b) {
    return a - b;
});
console.log(arr); // [ 1, 4, 6, 7, 9, 21 ]
// ---------------------
// 從大到小
var arr = [4, 6, 21, 9, 1, 7];
arr.sort(function (a, b) {
    return b - a;
})
console.log(arr);
​
// --------------------
// 隨機排序
var arr = [1, 4, 6, 7, 9, 21];
arr.sort(function () {
    return 0.5 - Math.random();
});
console.log(arr);

根據物件的key值排序

// 按date進行降序排序,如果date一樣,按DIU進行降序排序
var arr = [
    { "date": "2018-08-01", "DIU": 1209, "country": "US" },
    { "date": "2018-08-02", "DIU": 680, "country": "GB" },
    { "date": "2018-08-01", "DIU": 2311, "country": "CN" },
    { "date": "2018-08-02", "DIU": 879, "country": "US" },
    { "date": "2018-08-03", "DIU": 1525, "country": "CN" },
    { "date": "2018-08-02", "DIU": 1525, "country": "CN" }
];
​
arr.sort(function (a, b) {
    var t1 = Date.parse(a.date); // 隨機取得陣列項的date轉成時間戳
    var t2 = Date.parse(b.date);
    if (t1 === t2) {
        return b.DIU - a.DIU;
    } else {
        return t2 - t1;
    }
});
console.log(arr);
​
// console.log(Date.parse('2018-08-01')); // 1533081600000(將字串轉成時間戳)

按中文排

var arr = [
    { name: '麗昕', num: 78 },
    { name: '湯博', num: 38 },
    { name: '盧博', num: 58 },
    { name: '鄧鍵', num: 97 },
    { name: '繼昂', num: 56 },
    { name: '軍安', num: 78 },
    { name: '屈月', num: 98 },
    { name: '秋萍', num: 79 }
];
​
// 按中文排
arr.sort(function (a, b) {
    return a.name.localeCompare(b.name, 'zh');
});
console.log(arr);
​
// 按num排
arr.sort(function (a, b) {
    return a.num - b.num
});
console.log(arr);

7、排序演算法

  • 選擇排序

// 選擇排序:從第一項起,每一項都和後面所有項依次比較,如果被比較項比當前項小,則兩項交換位置。
// 每一輪,都找到一個最小的數,放到前面。
var arr = [5, 32, 2, 7, 45];
console.log(fn(arr)); // [2, 5, 7, 32, 45]
function fn(arr) {
    for (var i = 0; i < arr.length - 1; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                var temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        console.log(arr.toString()); // 內部每一輪排序的結果
    }
    return arr;
}

  • 氣泡排序

// 氣泡排序:從第一項起,比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。第一輪的時候最後一個元素應該是最大的一個。每一輪最後一個元素已經是最大的了,所以最後一個元素下一輪不用比較。

var arr = [5, 32, 2, 7, 45];
console.log(fn(arr)); // [ 2, 5, 7, 32, 45 ]
function fn(arr) {
    for (var i = 1; i < arr.length; i++) {
        for (var j = 0; j < arr.length - i; j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        console.log(arr.toString());
    }
    return arr;
}

  • 快速排序

// 快速排序:找到陣列的第一項,把它刪除。然後迴圈陣列,如果比第一項小的,放在一個left陣列中,如果比第一項大的,放在一個right的陣列中,然後遞迴呼叫上面的方法。

var arr = [4, 6, 2, 6, 5, 8, 4, 7, 3];
console.log(fn(arr)); // [ 2, 3, 4, 4, 5, 6, 6, 7, 8 ]
function fn(arr) {
    if (arr.length <= 1) {
        return arr;
    }
​
    var num = arr.shift(); // 刪除陣列第一項
    var left = []; // 儲存小於num的項
    var right = []; // 儲存大於等於num的項
for (var i = 0; i < arr.length; i++) {
        if (arr[i] < num) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    // console.log(left, num, right);
return fn(left).concat(num, fn(right));
}

8、join

陣列.join(引數)

將陣列拼接成字串。join()方法只接收一個引數,即用作分隔符的字串,然後返回包含所有陣列項的字串。

9、reverse

// 陣列.reverse(); 翻轉
var arr = ['a', 'b', 'c'];
arr.reverse();
console.log(arr); // [ "c", "b", "a" ]
// -------------------
var str = '我愛你';
console.log(str.split('').reverse().join(''));

10、indexOf和lastIndexOf

// IE8及以下不支援
// 陣列.indexOf(要查詢的項, [查詢的起始位置]);
// 陣列.lastIndexOf(要查詢的項, [查詢的起始位置]);
// 返回查詢的項在陣列中的下標
var arr = [4, 3, 4, 2, 45, 43, 6, 3, 5];
​
console.log(arr.indexOf(3)); // 1
console.log(arr.indexOf(3, 2)); // 7
console.log(arr.indexOf('3')); // -1
​
console.log(arr.lastIndexOf(3)); // 7

// 陣列去重
var arr = [2, 3, 4, 3, 3, 3];
console.log(fn(arr)); // [2,3,4]
function fn(arr) {
    var newArr = []; // 倉庫
    for (var i = 0; i < arr.length; i++) {
        // 檢查arr[i]在newArr中是否存在,如果不存在,則新增
        if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

11、slice

// 陣列.slice(起始下標, 結束下標);
var arr = [4, 3, 4, 2, 45, 43, 6, 3, 5];
​
console.log(arr.slice()); // [ 4, 3, 4, 2, 45, 43, 6, 3, 5 ]
console.log(arr.slice(2)); //  [ 4, 2, 45, 43, 6, 3, 5 ]
console.log(arr.slice(2, 6)); //  [ 4, 2, 45, 43 ]
console.log(arr.slice(2, -3)); //  [ 4, 2, 45, 43 ]
console.log(arr.slice(6, 2)); //  []

12、Array.isArray

// 因為typeof不能判斷陣列
// Array.isArray(引數)  IE8及以下不支援  如果引數是陣列,返回true,否則返回fasle
var arr = [];
console.log(typeof arr); // object
console.log(Array.isArray(arr)); // true
console.log(Array.isArray({})); // false

13、迭代方法

IE8及以下不支援

  • forEach

// 陣列.forEach(function (陣列項, 下標, 陣列本身) { });
// 作用:同for迴圈,用於遍歷陣列(沒有返回值)
var arr = ['劉備', '關羽', '張飛'];
arr.forEach(function (item, index, array) {
    console.log(item, index, array);
});

  • map

// 陣列.map(function (陣列項, 下標, 陣列本身) { });
// 作用:迴圈陣列,返回每次呼叫的結果組成的新陣列
var arr = [3, 6, 4];
var n = arr.map(function (item, index) {
    // console.log(item, index);
    return item * 2;
});
console.log(n); // [ 6, 12, 8 ]

  • filter

// 陣列.filter(function (陣列項, 下標, 陣列本身) { });
// 作用:返回每次呼叫的結果為true的項組成的陣列
var arr = [4, 45, 24, 4, 2];
var n = arr.filter(function (item, index) {
    // console.log(item, index);
    return item > 10 && item < 30;
});
console.log(n);

  • every

// 陣列.every(function (陣列項, 下標, 陣列本身) { });
// 作用:每一項呼叫的結果為true,則返回true
var arr = [4, 45, 24, 4, 2];
var n = arr.every(function (item, index) {
    // console.log(item, index);
    return item > 0;
});
console.log(n);

  • some

// 陣列.some(function (陣列項, 下標, 陣列本身) { });
// 作用:只要有一項返回true,結果就是true
var arr = [4, 45, 24, 4, 2];
var n = arr.some(function (item, index) {
    return item > 10;
});
console.log(n);