zoukankan      html  css  js  c++  java
  • 引用类型——数组

    JavaScript 数组

    • javascript中数组也是最常使用的对象之一,数组是值的集合,由于弱类型的原因,javascript中数组十分灵活、强大,不像java等强类型高级语言数组只能存放同一类或其子类型元素,javascript在同一数组中可以存放多种类型的元素,而且长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。

    创建数组

    1.无参构造函数,创建一空数组

              

    var a1 = new Array();

    2.一个数字参数构造函数,指定数组长度(由于数组长度可以动态调整,作用并不大),创建指定长度的数组。

     var a2 = new Array(5);

    3.带有初始化数据的构造函数,创建数组并初始化参数数据 

    var a3 = new Array(4,'hello',new Date());

    字面量

    1.使用方括号,创建空数组,等同于调用无参构造函数

    var a4=[];

     2.使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数

    var a5=[10];

    注意点

    1.在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中

    1 var a1=new Array(5);
    2 console.log(a1.length);//5
    3 console.log(a1); //[] ,数组是空的
    4 
    5 var a2=new Array(5,6);
    6 console.log(a2.length);//2
    7 console.log(a2); //[5,6]

    但是使用字面量方式,无论传入几个参数,都会把参数当作初始化内容

    var a1=[5];
    console.log(a1.length);//1
    console.log(a1); //[5]
    
    var a2=[5,6];
    console.log(a2.length);//2
    console.log(a2); //[5,6]

    2.使用带初始化参数的方式创建数组的时候,最好最后不要带多余的”,”,在不同的浏览器下对此处理方式不一样

    var a1=[1,2,3,];
    console.log(a1.length);
    console.log(a1);

    这段脚本在现代浏览器上运行结果和我们设想一样,长度是3,但是在低版本IE下确实长度为4的数组,最后一条数据是undefined

    数组的索引与长度

    1.数组的值可以通过自然数索引访问进行读写操作,下标也可以是一个得出非负整数的变量或表达式

    var a1=[1,2,3,4];
    console.log(a1[0]); //1
    var i=1;
    console.log(a1[i]); //2
    console.log(a1[++i]); //3

    2.数组也是对象,我们可以使用索引的奥秘在于,数组会把索引值转换为对应字符串(1=>”1”)作为对象属性名

    console.log(1 in a1);//true,确实是一个属性

    3.索引特殊性在于数组会自动更新length属性,当然因为JavaScript语法规定数字不能作为变量名,所以我们不能显示使用array.1这样的格式。由此可见其实负数,甚至非数字”索引“都是允许的,只不过这些会变成数组的属性,而不是索引

    var a=new Array(1,2,3);
    a[-10]="a[-10]";
    a["sss"]="sss";

    这样我们可以看出所有的索引都是属性名,但只有自然数(有最大值)才是索引,一般我们在使用数组的时候不会出现数组越界错误也正是因为此,数组的索引可以不是连续的,访问index不存在的元素的时候返回undefined

    var a=new Array(1,2,3);
    a[100]=100;
    console.log(a.length); //101
    console.log(a[3]); //undefined
    console.log(a[99]); //undefined
    console.log(a[100]); //100

    上面的例子中,虽然直接对a[100]赋值不会影响a[4]或a[99],但数组的长度却受到影响,数组length属性等于数组中最大的index+1,我们知道数组的length属性同样是个可写的属性,当强制把数组的length属性值设置为小于等于最大index值时,数组会自动删除indexd大于等于length的数据,在刚才代码中追加几句

    a.length=2
    console.log(a);//[1,2]

    这时候会发现a[2]和a[100]被自动删除了,同理,如果把length设置为大于最大index+1的值的时候,数组也会自动扩张,但是不会为数组添加新元素,只是在尾部追加空空间

    a.length=5;
    console.log(a); //[1,2] //后面没有3个undefined

    元素添加/删除

    基本方法

    上面例子已经用到向数组内添加元素方法,直接使用索引就可以

    var a=new Array(1,2,3);
    a[3]=4;
    console.log(a);//[1, 2, 3, 4]

    前面提到数组也是对象,索引只是特殊的属性,所以我们可以使用删除对象属性的方法,使用delete 删除数组元素javascript

    delete a[2];
    console.log(a[2]); //undefined

    这样和直接把a[2]赋值为undefined类似,不会改变数组长度,也不会改变其他数据的index和value对应关系

    栈方法

    删除方法,并不是我们希望的表现形式,我们很多时候希望删除中间一个元素后,后面元素的index都自动减一,数组length同时减一,就好像在一个堆栈中拿去的一个,数组已经帮我们做好了这种操作方式,pop和push能够让我们使用堆栈那样 LIFO(Last-In-First-Out)后进先出 使用数组

    var a=new Array(1,2,3);
    a.push(4);
    console.log(a);//[1, 2, 3, 4] 
    console.log(a.length);//4
    console.log(a.pop());//4
    console.log(a); //[1, 2, 3] 
    console.log(a.length);//3

    队列方法

    既然栈方法都实现了,队列FIFO(First-In-First-Out)先进先出怎么能少,shift方法可以删除数组index最小元素,并使后面元素index都减一,length也减一,这样使用shift/push就可以模拟队列了,当然与shift方法对应的有一个unshift方法,用于向数组头部添加一个元素 

    var colors = new Array();                   //创建一个数组
    var count = colors.push("red", "green");    //推入两项
    alert(count);  //2  
    count = colors.push("black");               //推入另一项 
    alert(count);     //3  
    var item = colors.shift();                  //取得第一项 
    alert(item);      //"red" 
    alert(colors.length); //2

    unshift可以和pop配合可以从相反的方向模拟队列

    var colors = new Array();                     //创建一个数组 
    var count = colors.unshift("red", "green");    //推入两项 
    alert(count);   //2
    count = colors.unshift("black");                //推入另一项  
    alert(count);   //3  
    var item = colors.pop();                       //取得最后一项 
    alert(item);    //"green" 
    alert(colors.length); //2  

    重排序方法

    数组中已经存在两个重新排序的方法,reverse()和sort(),其中reverse()仅仅用来反转数组顺序:

    var a = [1,8,9,12,21,2];
    a.reverse();
    alert(a); //[2,21,12,9,8,1];

    在默认的情况下,sort()方法安装升序排列数组项,但是,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较的是字符串。

    var values = [0, 1, 5, 10, 15]; 
    values.sort(); 
    alert(values);   //0,1,10,15,5

    但是这个样子,比较排序数字就不是很好了,以便指定哪个值位于哪个值前面。 这个函数很简单,有两个参数,如果第一个参数位于第二个参数之前。 返回负数,如果相等,返回0。反之,则返回正数:javascript

    function compare(value1,value2){
        if(value1 < value2){
            return -1;
        }else if(value1 > value2){
            return 1;
        }else{
            return 0;
        }
    }

    也可以非常简单的写成

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

    只要将这个函数传递给sort即可

    var values = [0, 1, 5, 10, 15]; 
    values.sort(compare); 
    alert(values);  //0,1,5,10,15 

    如果要降序排列的话,改变一下负数和正数的方向

    function compare(value1,value2){
        if(value1 < value2){
            return 1;
        }else if(value1 > value2){
            return -1;
        }else{
            return 0;
        }
    }

    操作方法

    concat()方法用于拼接数组,a.concat(b)返回一个a和b共同组成的新数组(a,b均为数组),

    var colors = ["red", "green", "blue"]; 
    var colors2 = colors.concat("yellow", ["black", "brown"]);  
    alert(colors);     //red,green,blue         
    alert(colors2);    //red,green,blue,yellow,black,brown

    slice()根据传入参数,返回当前数组中的一个或者多个项创建一个新数组,slice()方法不会影响原数组,slice()方法可以接收一个或两个参数,即数组的开始和结束位置,

    var colors = ["red", "green", "blue", "yellow", "purple"]; 
    var colors2 = colors.slice(1); 
    var colors3 = colors.slice(1,4);  
    alert(colors2);   //green,blue,yellow,purple 
    alert(colors3);   //green,blue,yellow 

    注意返回的结果并不包括起始和结束位置的值

    splice方法

    JavaScript提供了一个splice方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数

      1.开始索引

      2.删除元素的位移

      3.插入的新元素,当然也可以写多个

    删除

    指定前两个参数,可以使用splice删除数组元素,同样会带来索引调整及length调整

    var a=new Array(1,2,3,4,5);
    console.log(a.splice(1,3));//[2, 3, 4] 
    console.log(a.length);//2
    console.log(a);//[1,5]

    如果数组索引不是从0开始的,

    var a=new Array();
    a[2]=2;
    a[3]=3;
    a[7]=4;
    a[8]=5;
    
    console.log(a.splice(3,4)); //[3] 
    console.log(a.length); //5
    console.log(a); //[2: 2, 3: 4, 4: 5]

    上面例子可以看到,splice的第一个参数是绝对索引值,而不是相对于数组索引,第二个参数并不是删除元素的个数,而是删除动作执行多少次,并不是按数组实际索引移动,而是连续移动。同时调整后面元素索引,前面索引不理会

    插入与替换

    只要方法第二个参数,也就是删除动作执行的次数设为0,第三个参数及以后填写要插入内容就splice就能执行插入操作,而如果第二个参数不为0则变成了先在该位置删除再插入,也就是替换效果

    var a=new Array(1,2,3,4,5);
    a.splice(1,0,9,99,999);
    console.log(a.length); //8
    console.log(a);//[1, 9, 99, 999, 2, 3, 4, 5] 
    a.splice(1,3,8,88,888);
    console.log(a.length);//8
    console.log(a);//[1, 8, 88, 888, 2, 3, 4, 5]

    位置方法

    indexOf()和lastIndexOf(),这两个方法都接收两个参数:要查找的项和表示要查找位置的索引(可选),区别只是一个从开头开始找,一个从尾部开始找。

    var numbers = [1,2,3,4,5,4,3,2,1];  
    alert(numbers.indexOf(4));        //3 
    alert(numbers.lastIndexOf(4));    //5  
    alert(numbers.indexOf(4, 4));     //5 
    alert(numbers.lastIndexOf(4, 4)); //3  
    var person = { name: "Nicholas" }; 
    var people = [{ name: "Nicholas" }];  
    var morePeople = [person];  
    alert(people.indexOf(person));     //-1 
    alert(morePeople.indexOf(person)); //0 

    迭代方法

    • ECMAScript5为数组定义了5个迭代方法。每个方法都接受两个参数,第一个是进行迭代的函数,第二个是该函数的作用域对象【可选】
    • 进行迭代的函数接受三个参数,第一个是数组中要进行迭代的元素的值,第二个是数组候总要进行迭代的元素的位置,第三个是迭代数组本身。 1. every()对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true。
    • filter() 对数组中的每一项运行给定的函数,返回该函数返回true的项组成的数组。
    • forEach() 对数组中的每一项运行给定的函数,这个方法没有返回值
    • map() 对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
    • some()对数组中的每一项运行给定的函数,如果该函数对任意一项返回true,则返回true。
    var num = [1,2,3,4,5,6,7,8,9];
    var everyResult = num.every(function(item, index, array) {
        if(item > 2) {
            return true;
        }
    });
    alert(everyResult);
    
    var someResult = num.some(function(item) {
        if(item > 2) {
            return true;
        }
    });
    alert(someResult);
    
    var filterResult = num.filter(function(item) {
        if(item > 2) {
            return true;
        }
    });
    alert(filterResult);
    
    var mapResult = num.map(function(item) {
        if(item > 2) {
            return true;
        }
    });
    alert(mapResult);
    
    var forEachResult = num.forEach(function(item) {
        if(item > 2) {
            return true;
        }
    });
    alert(forEachResult);
  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/5huihui/p/4093332.html
Copyright © 2011-2022 走看看