04-JS数组遍历、去重

array.png

1.数组的创建

将一组无序的内容放在一个有序的列表中,这就是数组 。

不关心名称,只关心值和顺序,是引用型数据

  • 创建方式——一维数组

    1. 字面量方式
    var arr = [];
    var arr1 = [1,2,3,4]  //[1,2,3,4]
    arr[1] = 100;     //将数组的下标(索引值)为1设为100;下标是数值
    obj["1"] = 100; //对象中的1是字符串,键值是100
    
    1. 构造函数创建
    var arr2 = new Array();   //构造函数调用方式:new + 构造函数()
    var arr3 = new Array(1,2,3,4); //[1,2,3,4]
    // 区别:
    var arr11 = [10]; //length:1,其中第一项为10
    var arr22 = new Array(10);    //length:10,其中每一项都为empty
    

    如果设置下标为非正整数,这个下标作为对象的键值对存储在数组中,他会变成数组的属性存储,而不是下标。

    var arr = [1, 2, 3]
    arr[-1] = 4
    console.log(arr)//[ 1, 2, 3, '-1': 4 ]
    
    1. 对象构造函数创建
    var arr = new Object([]);
    
  • 二维数组的创建

    1. 直接赋值
    var arr=[
        [1,2,3,4,5],
        [1,2,3,4,5],
        [2,3,4,5,7],
    ]
    
    1. 循环赋值
    var arr=[];
    for(var i=0;i<10;i++){
        arr[i]=[];
        for(var j=0;j<10;j++){
            arr[i][j]=i*10+j;
        }
    }
    
    console.log(arr[5][6]);
    

2.数组的属性

  • 数组的长度

    数组之中的属性都是可以更改的

    数组的长度等于最大下标+1。

    var arr = [];
    arr.length = 10;  //arr.length随着数组的长度而改变,此时的length为10
    console.log(arr); 
    
  • 清空数组

    表示数组的元素全部清除掉,数组本身还存; 数组元素是对象的情况下,建议先将数组的所有元素设为null,再清空数组

    arr.length = 0;
    
  • 删除数组

    var arr = [];
    arr[0]  = 1;
    arr[10] = "hello";
    //删除数组的第一项
    arr[0] = undefined;
    console.log(arr); //[undefined, empty × 9, "hello"]
    //彻底删除某一项
    delete arr[0];        // [empty × 10, "hello"]
    //清空
    arr.length = 0;
    
  • 自动补位——特殊的赋值

    var arr = [];
    arr[10] = "hello"
    console.log(arr); //[empty × 10, "hello"] 
    

3. 数组项的遍历

  • 累加数组中的项

      var arr = [1, 2, 3, 4];
      var s = (function (s, n) {
          if (!arr[n]) return s;
          s += arr[n];
          return arguments.callee(s, n + 1);
      })(0, 0);
      console.log(s); //10
    
  • 循环清空数组

    var arr = [1, 2, 3, 4];
    for(;--arr.length;);
    //或
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        arr.length--;
    }
    
    1. 错误写法一

      //for(;arr.length--;); //减到最后一个元素的时候,会报错
      
    2. 错误写法二

    如果在循环过程中改变了数组的长度,那么数组长度就不能再循环中作为条件使用

    for(var i = 0; i < arr.length; i++){
        arr.length --;
    }
    
  • 查询遍历数组

    for循环,下标是数值型;而for in循环,下标是字符型。

    如果数组有可枚举属性时,for不可以遍历,而for in可以遍历

  1. for循环遍历

for循环可以遍历出undefined的元素,而for in不可以;

var  arr = [1,null,2,,3];      //2和3之间是undefined
arr.a = 10;
for(var i = 0; i < arr.length; i++){
    console.log(i, arr[i]);
}
//0 1
//1 null
//2 2
//3 undefined
//4 3
  1. for in循环遍历

for in循环只遍历属性名和值都存在的

另:for in 可以遍历可枚举属性

var  arr = [1,null,2,,3];
arr.a = 10;
for(var index in arr){
   console.log(index, arr[index]);
}
// 0 1
// 1 null
// 2 2
// 4 3
// a 10

4. 数组的内置API

  • push方法

    将一个或多个元素添加到数组的末尾,并返回该数组的新长度

    var animals = ['pigs', 'goats', 'sheep'];
    console.log(animals.push('cows'));     //  4
    console.log(animals); // Array ["pigs", "goats", "sheep", "cows"]
    
    var a1 = [['1', '2'],['3', '4']];
    var a2 = a1[0];
    console.log(a2.push(a1[1]));  //3(返回新数组的长度)
    console.log(a2);  //["1", "2", Array(2)]
    
  • unshift()方法

    将一个或多个元素添加到数组的开头,并返回该数组的新长度

    该方法修改原有数组

    var array1 = [1, 2, 3];
    console.log(array1.unshift(4, 5));    //  5
    console.log(array1);//  Array [4, 5, 1, 2, 3]
    
    var a1 = [['1', '2'], ['3', '4']];
    var a2 = a1[1];
    console.log(a2.unshift(a1[0]));   //3
    console.log(a2);  //[Array(2), "3", "4"]
    
  • pop方法

    从数组中删除最后一个元素,并返回该元素的值

    此方法更改数组的长度。

    var plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];
    
    console.log(plants.pop());        //"tomato"
    console.log(plants);  // Array ["broccoli", "cauliflower", "cabbage", "kale"]
    
    • 用pop从尾部删除并打印数组
    var arr = [1, 3, 5, 0, 7, 2, 4];
    var item;
    while((item = arr.pop) || item === 0){
        console.log(item);    //[4,2,7,0,5,3,1]
    }
    
  • shift方法

    从数组中删除第一个元素,并返回该元素的值。

    此方法更改数组的长度。 (从头部删除数组元素,效率是较低的)

    var array1 = [1, 2, 3];
    var firstElement = array1.shift();
    console.log(array1);
    //  Array [2, 3]
    console.log(firstElement);
    //  1
    
  • concat 数组的拼接

    concat() 方法用于连接两个或多个数组,此方法不修改原数组

    var a = [1,2,3];
    console.log(a.concat(4,5)); //[1,2,3,4,5]
    var a1 = [ ['1', '2'], ['3', '4'] ];
    var a2 = a1[0];
    console.log(a2.concat(a1[1]));
    console.log(a2); 
    //Array["1", "2", "3", "4"] 
    //Array["1", "2"]
    
  • join方法

    将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项,那么将返回该项而不使用分隔符。

    var elements = ['Fire', 'Air', 'Water'];
    
    console.log(elements.join());     //"Fire,Air,Water"
    console.log(elements.join(''));       //"FireAirWater"
    console.log(elements.join('-'));  //"Fire-Air-Water"
    
    //封装一个将数组转为字符串,并用符号进行分隔
        var arr = [12, 3, 45, 5, 3];
        function join(arr, symbol) {
            symbol === undefined ? symbol = "," : "";
            //原料
            var res = "";
            for (var i = 0; i < arr.length; i++) {
                res += (i !== 0 ? symbol : "") + arr[i];
            }
            return res;
        }
        console.log(join(arr, "%"));
    
  • slice()方法

    返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的浅拷贝(包括 begin,不包括end)。

    原始数组不会被改变。

    var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
    
    console.log(animals.slice(2));
    // expected output: Array ["camel", "duck", "elephant"]
    
    console.log(animals.slice(2, 4));
    // expected output: Array ["camel", "duck"]
    
    console.log(animals.slice(1, 5));
    // expected output: Array ["bison", "camel", "duck", "elephant"]
    console.log(animals)
    //['ant', 'bison', 'camel', 'duck', 'elephant']
    
    var  arr = [1, 2, 3, 4, 5, 6, 7, 8];
    console.log(arr.slice(1));    //[8]
    console.log(arr.slice(-1, -4));   //[],起点比终点还大,-1到-4之间没有交叉
    
  • splice()方法

    删除或替换现有元素或者原地添加新的元素来修改数组,并以新数组形式返回被修改的内容。

    此方法会改变原数组

    array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
    //开始的位置,删除元素的个数,要添加的元素
    

    start 指定修改的开始位置(从0计数)。

    如果超出了数组的长度,则从数组末尾开始添加内容;

    如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。

    var months = ['Jan', 'March', 'April', 'June'];
    var newMonths = months.splice(0);////从头删除到尾部,意味着将原数组的元素剪切到新数组中
    console.log(months,newMonths);    //[]   ["Jan", "March", "April", "June"]
    
    var months = ['Jan', 'March', 'April', 'June'];
    var newMonths = months.splice();
    console.log(months,newMonths);    //["Jan", "March", "April", "June"] []
    
    var months = ['Jan', 'March', 'April', 'June'];
    months.splice(1, 0, 'Feb');
    // 在第一位后插入了一个'Feb'
    console.log(months);  //['Jan', 'Feb', 'March', 'April', 'June']
    
    var arr=[1,3,5,0,7,2,4];
    var arr1=arr.splice(arr.length,0,10,11);
    //var arr1=arr.splice(arr.length+2,0,10,11); //效果和上一行一致
    console.log(arr); //[1, 3, 5, 0, 7, 2, 4, 10, 11]
    console.log(arr1);    //[]
    
    var arr=[1,3,5,0,7,2,4];
    var arr1=arr.splice(-3,3,10,11);
    console.log(arr); // [1, 3, 5, 0, 10, 11]
    console.log(arr1);    //[7, 2, 4]
    

    deleteCount 可选整数,表示要移除的数组元素的个数。

    如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。

    如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是说,如果它大于或者等于start之后的所有元素的数量),那么start之后数组的所有元素都会被删除。

    如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。

    var months = ['Jan', 'March', 'April', 'June'];
    months.splice(1, 10, 'May');  //从第一位开始,先删除10个元素,再添加'May'
    console.log(months);  // ['Jan', 'May']
    
    var months = ['Jan', 'March', 'April', 'June'];
    months.splice(1);
    console.log(months);  // ['Jan']
    
    var months = ['Jan', 'April', 'June'];
    var newMonth = months.splice(1,0,'Feb', 'March'); 
    console.log(months);  //["Jan", "Feb", "March", "April", "June"]
    //在第二位插入了10,原第二位向后挪动,因为没有删除元素,所以返回一个空数组
    console.log(newMonth);
    

    item1, item2, *...* 可选

    要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。

    var months = ['Jan', 'March', 'April', 'June'];
    months.splice(1, 10, 'May');
    console.log(months);  // ['Jan', 'May']
    
    var months = ['Jan', 'March', 'April', 'June'];
    var newMonths = months.splice(-2);    //没有填写要删除元素的个数,意味着从倒数第二个开始不,删除到尾部
    console.log(months);      // ["Jan", "March"]
    console.log(newMonths);       //["April", "June"]
    
    var arr = [1, 3, 5, 0, 7, 2, 4];
    var arr1=arr.splice(2,2); //从第二个后面开始,删除两个元素,并放入返回的新数组中
    console.log(arr,arr1);        //[1, 3, 7, 2, 4] (2) [5, 0]
    
    • 删除数组中为奇数的元素
    var arr = [1, 3, 5, 0, 7, 2, 4];
    var len = arr.length;
    for(var i = 0; i < len;){
        if(arr[i] % 2 === 1){
            arr.splice(i,1);
            continue
        }
        i++;
    }
    console.log(arr); //[0, 2, 4]
    
    var arr = [1, 3, 5, 0, 7, 2, 4];
    var arr1 = [];
    for(var i = 0; i < arr.length; i++){
        if(arr[i] % 2 !== 1){
            arr1.push(arr[i]);
        }
    }
    arr = arr1;
    console.log(arr); //[0, 2, 4]
    
  • sort()方法

    用就地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

    var months = ['March', 'Jan', 'Feb', 'Dec'];
    months.sort();
    console.log(months);
    // expected output: Array ["Dec", "Feb", "Jan", "March"]
    
    var array1 = [1, 30, 4, 21, 100000];
    array1.sort();
    console.log(array1);
    // expected output: Array [1, 100000, 21, 30, 4]
    

6.其他常用API介绍

  • 判断一个元素是否为数组的三种方法
list[i][j] instanceof Array
//或
Array.isArray(list[i][j])
//或
arr.constructor === Array
  • Math
Math.max(12,19,20);     //20,可以接收任意个参数,并返回参数中最大的一个
  • parseInt(string,进制)

parseInt(string, radix) string为字符串,radix为介于2-36之间的数。使用者告诉这个函数string(比如11)是radix(比如2)进制的,函数将固定返回string以十进制时显示的数(3)。

console.log(parseInt(' 0xFf', 16));     //255,n(2,36)进制转换为10进制
console.log(parseInt('1110', 2));       //14
  • toString()
var num = 123;
num.toString(16);   //7b, 10进制转换成n(2~36)进制
  • instanceof
console.log([] instanceof Array);   //true
console.log({} instanceof Array);   //false
console.log([] instanceof Object);      //true
console.log(function(){} instanceof Ojbect);    //true
console.log(typeof function(){});
console.log("a" instanceof Object);     //false
  • arr.length
arr.length   //得到数组的长度
  • toFixed()
var num = 123.789;
num.toFixed(2)  //123.79 方法可把 Number 四舍五入为指定小数位数的数字
  • substring()
"abcdefg".substring(2,4)    //cd
  • padStart()

用另一个字符串填充当前字符串(重复,如果需要的话) ,以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用的。

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foow");     //"foowfooabc"
"#" + parseInt(parseInt("FFFFFF", 16) * Math.random()).toString(16).padStart(6, 0);
//产生16进制随机颜色 
  • 求随机数
5-10之间的随机数
5 + Math.round(Math.random() * 5);
//总结如下规律
min - max之间的随机数
min + Math.floor(Math.random() * (max - min + 1));  

你可能感兴趣的:(04-JS数组遍历、去重)