zoukankan      html  css  js  c++  java
  • 招式百出的数组(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);
     



  • 相关阅读:
    Beans
    Redis记录-Redis命令
    Redis记录-Redis介绍
    RESTful记录-RESTful服务
    RESTful记录-RESTful内容
    RESTful记录-RESTful介绍
    HTTP记录-HTTP介绍
    Solr记录-solr检索和查询数据
    Solr记录-solr文档xml
    Solr记录-solr内核与索引
  • 原文地址:https://www.cnblogs.com/cyf666cool/p/13662987.html
Copyright © 2011-2022 走看看