JS基础笔记-关于数组 Array

120 阅读3分钟

数组

索引 从0开始的整数 存储性能比对象好 数组也是一个对象和普通对下个类似

  • 找对象
  • 搞对象

数组的基本操作

    //1.创建对象-构造函数的方法
    var arr = new Array();
    console.log(typeof arr);//object

    // 2.向数组中添加元素   语法: 数组[索引] = 值
    arr[0] = 1;
    arr[1] = 22;
    arr[2]= 33;
    console.log(arr);

    //3.读取元素   语法: 数组[索引] 
    console.log(arr[1]);
    console.log(arr[10]);//undefined

    //4.获取连续的数组的长度(元素的个数)   语法:数组.length
    //使用非连续的数组  ,使用length会获取最大索引+1
    console.log(arr.length);
                              
    //5.修改length的值   语法: 数组.length = 数值
    //1、若长度大于原始长度,则会增加数组元素:空白
    arr.length = 4;
    console.log(arr.length);//4
    console.log(arr);//(4) [1, 22, 33, 空白]
    //2.若长度小于原始长度,则数组多出部分会被截断
    arr.length = 1;
    console.log(arr.length);//1
    console.log(arr);//[1]
    
    //6.向数组的最后一个位置添加位置  语法: 数组[数组.length]=元素
    arr[arr.length] = 44;
    console.log(arr); //(4) [1, 22, 33, 44]

字面量创建数组

    //使用字面量来创建数组
    var arr = [];
    console.log(arr);

    var arr1 = [1, 2, 3];
    console.log(arr1);
    //使用构造函数的方法创建数组,也可以同时添加元素
    var arr2 = new Array(12, 232, 2, 23);
    console.log(arr2);//(4) [12, 232, 2, 23]

    
    //区别两种方法针对于只添加一个元素时
   
    var arr3 = [10];
    console.log(arr3);//[10] 数组中只有一个元素10


    var arr4 = new Array(10);
    console.log(arr4);//(10) [空属性 × 10]  数组的长度为10个空元素
    console.log(arr4.length);//10

数组元素可以任意类型

    //数组元素可以是任意类型
    var obj = {
      name: "haha"
    }
    var arr = [19, 'hello', null, true, undefined, obj];
    arr = [{ name: "沙和尚1" }, { name: "沙和尚2" }, { name: "沙和尚3" }]
    arr[arr.length] = function () {
      alert('hello');
    }

    arr[arr.length - 1]();
    arr[arr.length] = [1, 2, 3];
    console.log(arr);

数组的方法

    //数组的方法

    //  1. push()向数组中末尾添加一个或多个元素    区别:arra[arr.length]只能添加一个
    //并返回数组新长度
    var arr = ["孙悟空", "猪八戒", "沙和尚"];
    var result = arr.push("唐僧", "白龙马");
    console.log(arr);//(5) ['孙悟空', '猪八戒', '沙和尚', '唐僧', '白龙马']
    console.log(result); //5  返回的是新数组的长度


    //2.pop()可以删除数组的最后一个元素  -调用一次删除一次
    //并返回删除元素
    arr.pop();
    console.log(arr); (4)['孙悟空', '猪八戒', '沙和尚', '唐僧']

    var result1 = arr.pop();
    console.log(arr); (3)['孙悟空', '猪八戒', '沙和尚']
    console.log(result1);//唐僧  返回删除的是什么元素


    //3. unshift() 向数组的开头添加一个或多个元素  注意:其他索引会重新调整
    //并返回数组新长度
    console.log(arr);//(3) ['孙悟空', '猪八戒', '沙和尚']
    arr.unshift("牛魔王", "蜘蛛精");
    console.log(arr);//(5) ['牛魔王', '蜘蛛精', '孙悟空', '猪八戒', '沙和尚']


    //4. shift() 删除数组中的第一个元素
    //并返回删除元素
    arr.shift();
    console.log(arr);//(4) ['蜘蛛精', '孙悟空', '猪八戒', '沙和尚']

遍历数组

    //遍历数组  创建多个Person实例,存为数组对象,并筛选出满足条件的元素保存在新的数组中
    var arr = ["孙悟空", "猪八戒", "沙和尚", "蜘蛛精"];
    for (var i = 0; i < arr.length; i++) {
      console.log(arr[i]);
    }
    
    
    //数组中根据条件筛选元素
    var per1 = new Person("猪1", 13);
    var per2 = new Person("猪2", 14);
    var per3 = new Person("猪3", 12);
    var per4 = new Person("猪4", 18);
    var perArr = [per1, per2, per3, per4];

    //不满18岁的person封装到新的数组中返回
    function getChild(arr) {
      var newArr = [];
      for (i = 0; i < arr.length; i++) {// 遍历每一个数组中的元素
        var p = arr[i];
        if (p.age < 18) {//每一个元素(对象)的age进行判断
          newArr.push(p);//添加到新的数组中去
        }
      }
      return newArr; //返回新数组
    }

    var result = getChild(perArr);
    console.log(result);

forEach方法 --- ie8及以下不支持

  • 需要一个函数作为参数
    • 像这种函数,由我们创建不是我们调用的(浏览器调用的),我们称为回调函数
    • 数组中有几个元素,函数就会执行几次,每次执行时,浏览器会遍历道德元素以实参的形式传递进来,我们可以来定义形参,读取这些内容
    • 浏览器中在回调中会传递3个参数,(正在遍历的元素,正在遍历的索引,正在遍历的数组)
    var arr = ["猪八戒", "孙悟空", "沙和尚", "白龙马"];

    arr.forEach(function (a, b, c) {
      console.log(a, b, c);
      /*
      猪八戒 0 (4) ['猪八戒', '孙悟空', '沙和尚', '白龙马']
      孙悟空 1 (4) ['猪八戒', '孙悟空', '沙和尚', '白龙马']
      沙和尚 2 (4) ['猪八戒', '孙悟空', '沙和尚', '白龙马']
      白龙马 3 (4) ['猪八戒', '孙悟空', '沙和尚', '白龙马'] 
      */
    })

slice()

  • 可以在数组中提取指定元素
  • 参数:(开始索引,结束索引+1)
  • 结束索引可以省略,取到最后为止
  • 参数可以负数,-1表示倒数第一个为止,-2 表示倒数第二个为止
  • 该方法不会改变原数组,而是提取到新数组返回
    var arr = ["猪八戒", "孙悟空", "沙和尚", "白龙马"];

    var newArr = arr.slice(0, 2);
    console.log(newArr);//['猪八戒', '孙悟空']

    var newArr1 = arr.slice(1);
    console.log(newArr1);//['孙悟空', '沙和尚', '白龙马']

    var newArr3 = arr.slice(1, -1);
    console.log(newArr3);//['孙悟空', '沙和尚']

splice()

  • 可用于删除数组中的指定元素
  • 会影响原数组,将指定元素在原数组中删除,删除元素作为返回值返回
  • 可以3个参数 (开始位置索引,删除的数量,传递新的元素(放在开始位置索引之前))
    var arr = ["猪八戒", "孙悟空", "沙和尚", "白龙马"];

    // var result = arr.splice(0, 2);
    // console.log(result);// ['猪八戒', '孙悟空']

    // console.log(arr);// ['沙和尚', '白龙马']
    // var result = arr.splice(1, 2);
    // console.log(arr);//['猪八戒', '白龙马']
    // console.log(result);//['孙悟空', '沙和尚']

    // arr.splice(0, 1, "牛魔王", "铁扇公主");
    // console.log(arr);//['牛魔王', '铁扇公主', '孙悟空', '沙和尚', '白龙马']

    arr.splice(0, 0, "白骨精");
    console.log(arr);//['白骨精', '猪八戒', '孙悟空', '沙和尚', '白龙马']

数组去重

  var arr = [5, 5, 1, 2, 1, 1, 4, 4, 3, 2];

  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
	if (arr[i] == arr[j]) {
	  arr.splice(j, 1);
	  j--;//后面的元素会自动补位,所以需要再重复比较一此此位置;
	}
    }
}
console.log(arr);

数组的剩余方法

var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
var arr3 = [7, 8, 9];
var arr4 = [3, 11, 5, 2, 7, 6, 3, 8, 9, 8, 12];

concat()

合并数组或元素

var result = arr1.concat(arr2, arr3, 999, "数据");
console.log(result);
console.log(arr1);//不会对原数组产生影响

join()

转为字符出串或改变字符之间的分隔符

var result1 = arr1.join();
console.log(result1);//1,2,3

console.log(typeof result1);//string
var result2 = arr1.join("-");
console.log(result2);//1-2-3

var result3 = arr1.join("");
console.log(result3);//123

reverse()

将原数组进行转置

arr1.reverse();
console.log(arr1);//[3, 2, 1]  对原数组产生影响

sort()

数组排序 ——默认按照Unicode升序

arr4.sort();
console.log(arr4);//  [11, 12, 2, 3, 3, 5, 6, 7, 8, 8, 9]  

可以用回调函数来自己指定排序规则

回调函数中需要定义两个形参,浏览器将会分别使用数组中的元素作为实参去调用

使用哪个元素不确定,但是肯定数组中 a在b的前面

  • 浏览器会根据函数返回值的不同来决定元素的顺序
    • 若返回一个>0 的值,元素交换;
    • 若返回一个<0 的值,元素不交换;
    • 若返回一个0,则认为两个元素相等,也不会交换;
		
//升序
arr5 = [5, 4, 12, 3, 6, 8, 7, 11];
arr5.sort(function (a, b) {
	if (a > b) {
		return 1;
	} else if (a < b) {
		return -1;
	} else {
		return 0;
	}
})
console.log(arr5);//[3, 4, 5, 6, 7, 8, 11, 12]


//降序
arr6 = [5, 4, 12, 3, 6, 8, 7, 11];
arr6.sort(function (a, b) {
	if (a > b) {
		return -1;
	} else if (a < b) {
		return 1;
	} else {
		return 0;
	}
})
console.log(arr6);//[12, 11, 8, 7, 6, 5, 4, 3]


//优化 
arr6.sort(function (a, b) {
	return a - b;//升序
})
console.log(arr6);//[3, 4, 5, 6, 7, 8, 11, 12]

arr6.sort(function (a, b) {
	return b-a;//降序
})
console.log(arr6);//[12, 11, 8, 7, 6, 5, 4, 3]