• 招式百出的数组(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);
     



  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/cyf666cool/p/13662987.html
Copyright © 2020-2023  润新知